2012-10-09 41 views
5

Estoy tratando de implementar este diseño utilizando el diseño GridBag en JavaAjuste GridBag diseño

public static void addComponentsToPane(Container pane) { 
     if (RIGHT_TO_LEFT) { 
      pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
     } 

     JLabel label1,label2,label3,result,title; 
     JButton calculate_btn; 
     JTextField side1,side2,side3; 

    pane.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    if (shouldFill) { 
    //natural height, maximum width 
    c.fill = GridBagConstraints.HORIZONTAL; 
    } 


     title = new JLabel("Area of Triangle"); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 2; 
    c.gridy = -1; 
    pane.add(title, c); 



    label1 = new JLabel("Side 1: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 1; 
    pane.add(label1, c); 

     label2 = new JLabel("Side 2: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 2; 
    pane.add(label2, c); 


     label3 = new JLabel("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 1; 
    c.gridy = 3; 
    pane.add(label3, c); 

     side1 = new JTextField(" "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 1; 
    pane.add(side1, c); 

     side2 = new JTextField("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 2; 
    pane.add(side2, c); 

     side3 = new JTextField("Side 3: "); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 3; 
    pane.add(side3, c); 

    calculate_btn = new JButton("Calculate"); 
    //c.fill = GridBagConstraints.HORIZONTAL; 
    c.ipady = 30;  //make this component tall 
    c.weightx = 0.5; 
    c.gridwidth = 3; 
    c.gridx = 0; 
    c.gridy = 5; 
    pane.add(calculate_btn, c); 

     result = new JLabel("Result displayed here"); 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 
    c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipady = 20; 
    c.gridx = 2; 
    c.gridy = 7; 
    pane.add(result, c); 


    } 

Así que el código anterior es básicamente sólo los componentes que serán añadidos a una interfaz gráfica de usuario, pero no estoy muy consiguiendo lo que quiere, esto es lo que estoy tratando de lograr

enter image description here

Pero esto es lo que quiero decir con el código anterior

enter image description here

Así que cuando compilo lo anterior es lo que endup con, también, si es posible no quiero al usuario cambiar el tamaño de la ventana, supongo que seguirán algunos booleano con una de las propiedades de la ventana ..

+0

'pane.setComponentOrientation (ComponentOrientation.RIGHT_TO_LEFT);' esta línea de código es por '' Darryl Burke' o camickr', especialmente por segundo de los Gurús de Swing mencionadas han conseguido algunos ejemplos sobre GBC en este foro, – mKorbel

+0

GBC sólo funciona (correctamente) sólo en el caso de que todas las columnas están llenas (utilizar JComponents invisibles), entonces se puede utilizar cualquiera de columna para cualquiera de las filas :-), – mKorbel

+0

1 de tener un intento a mano 'GridBagLayout' – MadProgrammer

Respuesta

3

El problema es que están estableciendo su ipady la que "se extiende" su componente vertical. Usted está probablemente en busca de la propiedad insets: http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagConstraints.html#insets

Pruebe con esto:

c.insets = new Insets(10, 0, 10, 0); 
+0

Sí, eso es todo. – Zarkonnen

+0

¿qué pasa con el tamaño predeterminado cuando el programa se inicializa? está saliendo muy pequeño. Quiero arreglar esto. – noobprogrammer

+0

¿También el TÍTULO de la aplicación cómo empujarlo hasta la parte superior? – noobprogrammer

2

Un problema que Estoy viendo con su código que está reutilizando el mismo objeto GridBagConstraints para todos los elementos que agrega, lo cual no es recomendable.

Mi consejo sería utilizar un constructor de interfaz gráfica de usuario, como los que están disponibles en NetBeans o Eclipse. Las GUI de codificación manual en Java son muy dolorosas, y GridBagLayout en particular fue diseñada para su uso en el código de diseño generado.

Alternativamente, usar algo como TableLayout - o morder la bala y read up en las complejidades de GridBagConstraints.

+3

Reutilizar el mismo GBC no es un problema. Puede parecer feo, pero ese no es el problema aquí. –

3

Aquí hay otro método que utiliza un GridBagLayout que se traduce en ...

enter image description here enter image description here

public class TestLayout { 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FormPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    protected static class FormPane extends JPanel { 

     JLabel label1, label2, label3, result, title; 
     JButton calculate_btn; 
     JTextField side1, side2, side3; 

     public FormPane() { 
      // You may not need this, I needed it because the window packed to 
      // small on my mac ;)    
      setBorder(new EmptyBorder(4, 4, 4, 4)); 

      setLayout(new GridBagLayout()); 
      GridBagConstraints c = new GridBagConstraints(); 

      title = new JLabel("Area of Triangle"); 
      label1 = new JLabel("Side 1: "); 
      label2 = new JLabel("Side 2: "); 
      label3 = new JLabel("Side 3: "); 
      side1 = new JTextField(4); 
      side2 = new JTextField(4); 
      side3 = new JTextField(4); 
      calculate_btn = new JButton("Calculate"); 

      result = new JLabel("Result displayed here"); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.anchor = GridBagConstraints.NORTH; 
      gbc.gridwidth = 2; 
      gbc.weighty = 1; 
      add(title, gbc); 

      gbc.weighty = 0; 
      gbc.gridy = 1; 
      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridwidth = 1; 
      add(label1, gbc); 
      gbc.gridy++; 
      add(label2, gbc); 
      gbc.gridy++; 
      add(label3, gbc); 

      gbc.gridy = 1; 
      gbc.gridx = 1; 
      add(side1, gbc); 
      gbc.gridy++; 
      add(side2, gbc); 
      gbc.gridy++; 
      add(side3, gbc); 

      gbc.gridx = 0; 
      gbc.gridwidth = 2; 
      gbc.gridy++; 
      add(result, gbc); 

      gbc.gridy++; 
      gbc.weighty = 1; 
      gbc.anchor = GridBagConstraints.NORTH; 
      add(calculate_btn, gbc); 

     } 

    } 

} 

Si desea agregar espacio entre el título y los campos, d alguna Insets

gbc.insets = new Insets(0, 0, 8, 0); 
add(title, gbc); 

// Don't forget to reset them ;) 
gbc.insets = new Insets(0, 0, 0, 0); 

me he dado cuenta de que los resultados se deben mostrar en la tecla. simple canje de las líneas add(result, gbc) y add(calculate_btn, gbc), todo debe seguir siendo el mismo

+0

¡EXCELENTE! ¿Hay alguna forma de establecer el tamaño del JFRAME y bloquearlo con esos tamaños? – noobprogrammer

+0

JFrame.setSize, tenga cuidado, ya que trabaja en un entorno variable, donde el tamaño de fuente, el DPI y la resolución nunca son los mismos, es mejor usar el paquete para permitir que el marco se ajuste al tamaño preferido de su contenido. Tiendo a agregar un borde vacío para muchos de mis marcos para darle un poco de espacio alrededor del contenido. Para evitar que el usuario cambie el tamaño del marco, use JFrame.setResizable – MadProgrammer