2011-06-15 13 views
11

Soy nuevo en Java Swing y he estado luchando para iniciar el GridBagLayout desde la esquina superior izquierda para que c.gridx = 0 c.gridy = 0 ponga mi objeto en el Esquina superior izquierda.Iniciando GridBagLayout desde la esquina superior izquierda en Java Swing

lo agradecería si me pudiera ayudar al decirle lo que tengo que hacer después de este punto:

JPanel panel = new JPanel(new GridBagLayout()); 
    frame.add(panel); 
    GridBagConstraints c = new GridBagConstraints(); 

sé que tengo que usar noroeste, o FIRST_LINE_START constantes, pero no sé cómo . Intenté hacerlo de esta manera ", pero no se dio cuenta de las constantes.

frame.getContentPane().add(panel, BorderLayout.NORTHWEST); 

Gracias por su ayuda.

Respuesta

10

Necesita usar su propiedad GridBagConstraints 'anchor. Esto debe hacerlo por usted:

frame.setLayout(new GridBagLayout()); 
GridBagConstraints gbc = new GridBagConstraints(); 
gbc.anchor = GridBagConstraints.NORTHWEST; 
frame.add(panel, gbc); 

No estoy garantizando que usted no tendrá que establecer otras propiedades de las restricciones de objeto para obtener el diseño que desea. En particular, puede necesitar configurar widthx y widthy como 1 para que el panel ocupe todo el espacio disponible que se le asigna.

+0

@Emir: Usted puede hacer eso, aunque me parece que es generalmente agradable para mantener el panel en una clase separada de la estructura que lo sostiene. Si lo hace, ni siquiera necesita extender JFrame, solo necesita agregar el panel a un JFrame recto. Si usas 'frame.add() ',' frame.setLayout() ', etc. lo que está haciendo es delegar las llamadas a un panel especial llamado" panel de contenido ". –

+0

¡Gracias, todo lo que tenía que hacer era la magia weighty-weighty! – Emir

+0

@MarkPeters ¿Se puede hacer esto sin un Marco? Tengo mi GridBagLayout incrustado dentro de DeckLayout, y el Frame no funcionaría para mí. CUALQUIER ayuda que puedas proporcionar sería genial. Me estoy cansando un poco o jugando con Layouts (tengo el problema exacto del póster original) – theJollySin

15

Lea la sección del tutorial de Swing en How to Use GridBagLayout. La sección en "weightx, weighty" establece:

A menos que especifique al menos un valor distinto de cero para weightx o weighty, todos los componentes se agrupan en el centro de su contenedor.

+0

Gracias por aclararme; La publicación de Mark me ayudó a entender eso. – Emir

+0

Esto es exactamente lo que necesitaba, gracias. No quería tener que jugar con el diseño del panel dentro del marco. Y esto solo funcionó con la adición de algunas líneas adicionales con mi configuración de GridBagConstraints. Excelente. – tsm

5

Para aquellos que usan IDE (por ejemplo, NetBeans), finalmente encontré un buen truco: si quieres agregar componentes al principio y usar sus tamaños preferidos: agrega otro panel vacío con weighty = 1.0. Copiados del código generado automáticamente (NetBeans):

gridBagConstraints = new java.awt.GridBagConstraints(); 
gridBagConstraints.gridx = 0; 
gridBagConstraints.gridy = 2; 
gridBagConstraints.weighty = 1.0; 
jPanelOptions.add(jPanelFiller, gridBagConstraints); 
0

si desea que la cuadrícula para recorrer todo el camino hasta la cima, concebidas simplemente todo su peso = 0 hasta el último punto, la pusieron a cualquier número mayor que 0, empujará efectivamente el resto de los botones hacia la parte superior.

No olvide aumentar también el valor de cuadrícula de su botón.

De lo contrario, estará centrado. (el mismo se puede hacer usando gridx y el valor weightx si te enviaban utilizando la propiedad c.fill = GridBagConstraints.HORIZONTAL.)

3

una manera rápida y sencilla:

añadir un JLabel en blanco al final de la página:

// your code goes here 
    gbc.weightx = 1; 
    gbc.weighty = 1; 

    bg.add(new JLabel(" "), gbc); // blank JLabel 
+0

Funcionó perfectamente. Nota: es importante usar gbc.weightx = 1 y gbc.weighty = 1 justo al final del código, justo antes de agregar el JLabel en blanco. Por lo tanto, no se aplicará a todos los componentes, sino solo al JLabel en blanco. – viniciussss

0

Hay una solución. Puede colocar el panel GridBagLayout en un panel BorderLayout con BorderLayout.NORTH. Luego, el componente en el panel GridBagLayout comenzará desde la posición superior.

static void test4(){ 
    JFrame frame = new JFrame("Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(480, 360); 

    JPanel borderLayoutPanel=new JPanel(new BorderLayout()); 
    JPanel gridBagLayoutPanel = new JPanel(new GridBagLayout()); 
    borderLayoutPanel.add(gridBagLayoutPanel, BorderLayout.NORTH); 
    frame.add(borderLayoutPanel); 

    JButton testButton=new JButton("test button"); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.gridx=0; 
    c.gridy=0; 
    gridBagLayoutPanel.add(testButton, c); 

    frame.setVisible(true); 
} 

enter image description here

Cuestiones relacionadas