2009-05-22 19 views
9

Tengo un panel que usa el diseño de grupo para organizar algunas etiquetas. Quiero mantener este panel en el centro de la pantalla cuando vuelva a clasificar según el tamaño. Si coloco el panel dentro de otro panel usando el diseño de flujo, puedo mantener las etiquetas centradas horizontalmente pero no verticalmente. ¿Qué administrador de diseño me permitirá mantener el panel centrado en el centro de la pantalla?Centro vertical del administrador de disposición de Java

También probé el diseño del borde y lo coloqué en el centro, pero cambia el tamaño del tamaño de la ventana.

Respuesta

20

Intente utilizar un GridBagLayout y agregue el panel con un objeto GridBagConstrants vacío.
Por ejemplo:

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setLayout(new GridBagLayout()); 
    JPanel panel = new JPanel(); 
    panel.add(new JLabel("This is a label")); 
    panel.setBorder(new LineBorder(Color.BLACK)); // make it easy to see 
    frame.add(panel, new GridBagConstraints()); 
    frame.setSize(400, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
+2

Siempre me he preguntado cómo hacer esto, al final me di por vencido y se utiliza MigLayout lugar. – gencoreoperative

+4

Esto es lo que pienso de gridbag: http://madbean.com/anim/totallygridbag/ :) – qben

+0

GridBagLayout falla HARD cuando el contenedor es más pequeño que el tamaño preferido (pero más grande que el tamaño mínimo) del niño. –

9

En primer lugar, debo mencionar, leer mi artículo sobre diseños: http://web.archive.org/web/20120420154931/http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/. Es viejo pero muy útiles (por desgracia ese artículo es anterior a BoxLayout tengo algunas diapositivas cuando me dio de que hablar en JavaOne, que incluye BoxLayout en http://javadude.com/articles/javaone.)

Trate BoxLayout:

Box verticalBox = Box.createVerticalBox(); 
verticalBox.add(Box.createVerticalGlue()); 
verticalBox.add(stuffToCenterVertically); 
verticalBox.add(Box.createVerticalGlue()); 

y si quieres para centrar esas cosas, utilizar un HorizontalBox como el stuffToCenterVertically:

Box horizontalBox = Box.createHorizontalBox(); 
horizontalBox.add(Box.createHorizontalGlue()); 
horizontalBox.add(stuffToCenter); 
horizontalBox.add(Box.createHorizontalGlue()); 

manera más fácil de "ver" en el código de GridBag

+1

Estoy de acuerdo en que GridBagLayout es generalmente más complejo, pero para centrar un solo panel, son solo dos líneas. –

+0

El problema es que no se puede "ver" que al leer el código ... (He editado mi respuesta para indicar "ver" en lugar de "más fácil" ...) –

+0

Yo "veo" ... Pero en el Por otro lado, "createVerticalGlue()" tampoco significa nada para mí, sin leer los documentos. –

0

GroupLayout en el panel, con GroupLayout.Alignment.CENTER, tanto vertical como horizontal, y setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight)) para configurar el panel para que no cambie de tamaño.

También puede establecer setMinimumSize y establecer el tamaño máximo en el panel, solo para estar seguro.

Si te sientes elegante, puedes utilizar un solo GroupLayout para todo, eligiendo cuidadosamente grupos paralelos/secuenciales y agrupando las etiquetas apropiadamente.

0

Puede construir su propio LayoutManager para centrar un solo componente (ambos ejes o solo uno). Aquí está el que lo hace en ambos ejes, puede cambiarlo fácilmente para tener un centrado vertical u horizontal.

Los diseños actuales de implementación primer hijo visibles, puede cambiar eso también ...

public class CentreLayout implements LayoutManager, java.io.Serializable { 

public void addLayoutComponent(String name, Component comp) { 
} 

public void removeLayoutComponent(Component comp) { 
} 

public Dimension preferredLayoutSize(Container target) { 
    return target.getPreferredSize(); 
} 

public Dimension minimumLayoutSize(Container target) { 
    return target.getMinimumSize(); 
} 

public void layoutContainer(Container target) { 
    synchronized (target.getTreeLock()) { 
     Insets insets = target.getInsets(); 
     Dimension size = target.getSize(); 
     int w = size.width - (insets.left + insets.right); 
     int h = size.height - (insets.top + insets.bottom); 
     int count = target.getComponentCount(); 

     for (int i = 0; i < count; i++) { 
      Component m = target.getComponent(i); 
      if (m.isVisible()) { 
       Dimension d = m.getPreferredSize(); 
       m.setBounds((w - d.width)/2, (h - d.height)/2, d.width, d.height); 
       break; 
      } 
     } 
    } 
} 

} 
+0

desafortunadamente, esto no funciona para mí. Obtengo un desbordamiento de pila (haha) en el método 'preferredLayoutSize'. – Atmocreations

Cuestiones relacionadas