2012-03-02 9 views
5

Tengo una UI mediana-grande que usa un BorderLayout; el centro es un panel con pestañas que contiene varios paneles con varios diseños, etc.Manteniendo los tamaños preferidos de los componentes en el centro de BorderLayout

Quiero que el panel en el centro de este diseño de borde cambie de tamaño de acuerdo con el tamaño de la ventana, pero no quiero los componentes dentro el panel para estirar. Etiquetas, cuadros combinados, campos de texto, botones: quiero que se mantengan en sus tamaños preferidos y permitan que el panel que los contiene se estire. Los puse en un panel de desplazamiento en caso de que el espacio sea demasiado pequeño para el panel.

Varios carteles con coloridos vocabularios advierten sobre el peligro de utilizar cualquiera de los métodos setXXXsize() en los componentes. Eso es lo que hago ahora, y me gustaría aprender cómo evitarlo.

GridBagLayout no es apropiado para algunos de mis paneles. Está, por naturaleza, orientado alrededor de filas y columnas, y no todo cabe en filas y columnas. Por supuesto, podría crear filas y columnas artificiales para encajar todo, pero realmente espero que Swing tenga más opciones de diseño que eso.

Vertical Glue no lo hace tampoco. He incluido en SSCE amada de HFOE:

package example; 

    import java.awt.BorderLayout; 

    import javax.swing.Box; 
    import javax.swing.BoxLayout; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 

    public class BorderAndBox extends JFrame 
    { 
     public static void main(String args[]) 
     { 
      BorderAndBox bnb = new BorderAndBox(); 
      bnb.createUI(); 
      bnb.setVisible(true); 
     } 

     public void createUI() 
     { 
      JPanel borderPanel = new JPanel(new BorderLayout()); 

      JLabel northLabel = new JLabel("Nawth"); 
      borderPanel.add(northLabel, BorderLayout.NORTH); 

      String[] southComboChoices = { "one", "two", "three" }; 
      JComboBox southCombo = new JComboBox(southComboChoices); 
      borderPanel.add(southCombo, BorderLayout.SOUTH); 

      JPanel centerPanel = new JPanel(); 
      centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
      String[] firstChoices = { "first", "uno", "UN" }; 
      String[] secondChoices = { "second", "dos", "zwei" }; 
      String[] thirdChoices = { "third", "tres", "drei" }; 
      JComboBox firstCombo = new JComboBox(firstChoices); 
      JComboBox secondCombo = new JComboBox(secondChoices); 
      JComboBox thirdCombo = new JComboBox(thirdChoices); 
      centerPanel.add(firstCombo); 
      centerPanel.add(secondCombo); 
      centerPanel.add(thirdCombo); 
      centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
      // take up available vertical space, instead it appears to create a space 
      // that is shared equally among the (now) four components of this space. 
      borderPanel.add(centerPanel, BorderLayout.CENTER); 

      getContentPane().add(borderPanel); 
      pack(); 
     } 

    } 

Si agranda la ventana, los cuadros combinados en el centro agrandar; como está escrito, una pieza de pegamento vertical debajo de ellos también se agranda, pero no ocupa todo el espacio disponible. Parece que tiene tanto espacio como cada uno de ellos.

Entonces, ¿cuál es una buena manera de abordar esto?

+0

* "... SSCE querido:" * Me encanta también. Y es SSCCE (2 Cs). ;) –

+0

no puede ser simplemente un pequeño ejemplo autocontenido? – arcy

+0

* "¿no puede ser simplemente un pequeño ejemplo autocontenido?" * [Citando] (http://sscce.org/#co) una de mis personas favoritas: * "En este documento, correcto (o compilable, que particularmente se relaciona con el código fuente de la computadora) significa asegurarse de que su ejemplo cumpla con los estándares y protocolos aceptados. "* punto más notable *" Asegúrese de que su ejemplo sea correcto. O el ejemplo compila limpiamente, o causa el mensaje de error exacto acerca del cual quiero ayuda. "* El código compilado y mostró el problema, fácil de hacer. It * is * a SSCCE. :) –

Respuesta

10

BorderAndBox - centered

import java.awt.BorderLayout; 
import java.awt.GridBagLayout; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class BorderAndBox extends JFrame 
{ 
public static void main(String args[]) 
{ 
    BorderAndBox bnb = new BorderAndBox(); 
    bnb.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    bnb.createUI(); 
    bnb.setVisible(true); 
} 

public void createUI() 
{ 
    JPanel borderPanel = new JPanel(new BorderLayout()); 

    JLabel northLabel = new JLabel("Nawth"); 
    borderPanel.add(northLabel, BorderLayout.NORTH); 

    String[] southComboChoices = { "one", "two", "three" }; 
    JComboBox southCombo = new JComboBox(southComboChoices); 
    borderPanel.add(southCombo, BorderLayout.SOUTH); 

    JPanel centerPanel = new JPanel(); 
    centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
    String[] firstChoices = { "first", "uno", "UN" }; 
    String[] secondChoices = { "second", "dos", "zwei" }; 
    String[] thirdChoices = { "third", "tres", "drei" }; 
    JComboBox firstCombo = new JComboBox(firstChoices); 
    JComboBox secondCombo = new JComboBox(secondChoices); 
    JComboBox thirdCombo = new JComboBox(thirdChoices); 
    centerPanel.add(firstCombo); 
    centerPanel.add(secondCombo); 
    centerPanel.add(thirdCombo); 
    centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
    // take up available vertical space, instead it appears to create a space 
    // that is shared equally among the (now) four components of this space. 
    JPanel centerPanelConstrain = new JPanel(new GridBagLayout()); 
    centerPanelConstrain.add(centerPanel); 
    borderPanel.add(centerPanelConstrain, BorderLayout.CENTER); 

    getContentPane().add(borderPanel); 
    pack(); 
} 

} 

Ver también this answer. Hay más de una forma de resolver esto.

+0

Es un lindo truco; Supongo que puedo jugar con el GridBagLayout de mi componente individual para que aparezca en la esquina superior izquierda, como me gustaría. ¿Te importaría explicar por qué esto funciona? – arcy

+0

* "¿Te importaría explicar por qué esto funciona?"* Un único componente añadido a un GBL sin restricción termina en el centro. En cuanto a cualquier otra posición, no estoy seguro. Solo uso GBL para centrar componentes individuales, y hace mucho tiempo para una tabla periódica (arreglando cada elemento). Hoy probablemente haga lo último usando 'GroupPlayout'. No soy un experto en GBL. –

+0

GroupPlayout? LOL, +1 aunque, yo también estaba a punto de publicar la misma lógica, pero parece que yo también lo soy demasiado tarde. –

-1

yo le recomendaría el uso de JPanel con javax.swing.GroupLayout. Sin embargo, no es fácil usar este diseño codificándolo. Use generadores de código como Netbeans Matisse Builder y copie y péguelo donde desee si no desea usar el IDE.

+1

GroupLayout, al igual que GridBagLayout, se trata de filas y columnas; Posiblemente podría usar un GroupLayout de la misma manera que el Sr. Thompson me acaba de mostrar GridBagLayout, veré si es más fácil ponerlo en la esquina superior izquierda como quiero. Pero creo que tanto el diseño de grupos como el de GridBag son opciones deficientes para paneles con varios componentes pero sin apariencia de fila/columna. – arcy

Cuestiones relacionadas