gridbagconstraints ejemplos ejemplo dividir java swing user-interface gridbaglayout

java - ejemplos - ¿Por qué GridBagLayout centra mis componentes en lugar de ponerlos en la esquina?



insets java ejemplo (5)

Hasta ahora he logrado evitar utilizar el GridBagLayout (con el código de la mano) tanto como sea posible, pero no pude evitarlo esta vez y estoy leyendo el tutorial SUN GridBagLayout Hasta ahora, no está yendo bien. Creo que estoy mal entendiendo algo.
Por ejemplo, intento el siguiente código (similar al de la publicación de SUN):

public class MainFrame extends JFrame { public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainFrame frame = new MainFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame */ public MainFrame() { super(); setBounds(100, 100, 500, 375); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container mainContainer = getContentPane(); mainContainer.setLayout(new GridBagLayout()); //add label JLabel someLabel = new JLabel("Label 1:"); GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 0; constraints.gridy = 0; //constraints.anchor = GridBagConstraints.FIRST_LINE_START; //constraints.weightx = 0.5; mainContainer.add(someLabel, constraints); JTextField someText = new JTextField(30); constraints = new GridBagConstraints(); constraints.gridx = 1; constraints.gridy = 0; constraints.weightx = 0.5; mainContainer.add(someText, constraints); // } }

Obtengo la etiqueta y el campo de texto uno al lado del otro en el centro del encuadre.
Pero esperaba que aparecieran en la esquina superior izquierda ya que la cuadrícula y la cuadrícula son 0 para la etiqueta.
Incluso si configuro constraints.anchor = GridBagConstraints.FIRST_LINE_START; sigue siendo el mismo resultado.
¿Me equivoco aquí?
Desde la publicación de SUN:

Especifique la fila y la columna en la esquina superior izquierda del componente. La columna más a la izquierda tiene la dirección gridx = 0 y la fila superior tiene la dirección gridy = 0.


Agregar constraints.weighty = 1; a las restricciones JLabel y constraints.anchor = GridBagConstraints.NORTHWEST; a las restricciones de TextField.

EDITAR:

De la guía GridBagLayout de Oracle:

Los números más grandes indican que la fila o columna del componente debería tener más espacio. Para cada columna, el peso está relacionado con el mayor pesox especificado para un componente dentro de esa columna, dividiendo el peso de cada componente de la columna por columnas entre las columnas en las que se encuentra el componente. De manera similar, el peso de cada fila está relacionado con el peso más alto especificado para un componente dentro de esa fila. El espacio extra tiende a ir hacia la columna más a la derecha y la fila inferior.


Es posible que no responda tu pregunta directamente, pero créeme, debes hacer pruebas y errores en los diseños con un IDE. Yo personalmente sugiero Netbeans . Allí puede arrastrar y soltar y luego echar un vistazo a las propiedades. Al principio tendría algunos valores predeterminados en el inspector de propiedades y, por lo tanto, menos código generado automáticamente para eso. Pero luego, una vez que comienzas a jugar con los diseños, puedes ver el código y obtener una buena comprensión de cómo haces lo que haces.


Puede lograr esto utilizando un truco, agregar un componente ficticio después de su fila y expandirlo para llenar el espacio vertical. También puede volver a utilizar las restricciones, no es necesario crear un nuevo objeto:

EDITAR: ok olvida el truco :( La manera correcta es como Deon Botha y BenCole dijeron, he actualizado mi código usando el ancla

NO acepte esta respuesta, acepte los de Deon o los de Ben.

public class MainFrame extends JFrame { public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainFrame frame = new MainFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public MainFrame() { super(); setBounds(100, 100, 500, 375); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container mainContainer = getContentPane(); mainContainer.setLayout(new GridBagLayout()); JLabel someLabel = new JLabel("Label 1:"); JTextField someText = new JTextField(30); GridBagConstraints constraints = new GridBagConstraints(); constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.gridx = 0; constraints.gridy = 0; constraints.weightx = 1.0; mainContainer.add(someLabel, constraints); constraints.gridx = 1; constraints.weightx = 1.0; constraints.weighty = 1.0; mainContainer.add(someText, constraints); } }


weightX/weightY leer más abajo en el tutorial de Swing para la sección sobre weightX/weightY donde dice:

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.

Has especificado un pesoX pero no una pesoY.

Editar, es más complicado de lo que pensaba. Parece que también necesita especificar:

constraints.anchor = GridBagConstraints.FIRST_LINE_START;

para ambos componentes en adición al pesado.


Esto funcionó para mí:

public class NewJFrame extends javax.swing.JFrame { public NewJFrame() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel2 = new javax.swing.JPanel(); jComboBox3 = new javax.swing.JComboBox(); jComboBox4 = new javax.swing.JComboBox(); jComboBox5 = new javax.swing.JComboBox(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setBackground(new java.awt.Color(255, 204, 51)); setMinimumSize(new java.awt.Dimension(800, 600)); getContentPane().setLayout(null); jPanel2.setLayout(new java.awt.GridBagLayout()); jComboBox3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; jPanel2.add(jComboBox3, gridBagConstraints); jComboBox4.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; jPanel2.add(jComboBox4, gridBagConstraints); jComboBox5.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel2.add(jComboBox5, gridBagConstraints); getContentPane().add(jPanel2); jPanel2.setBounds(30, 40, 150, 260); pack(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); } }); } private javax.swing.JComboBox jComboBox3; private javax.swing.JComboBox jComboBox4; private javax.swing.JComboBox jComboBox5; private javax.swing.JPanel jPanel2; }