2009-05-22 11 views
9

Ho un pannello che utilizza il layout di gruppo per organizzare un'etichetta. Voglio mantenere questo pannello centrale dello schermo quando ridimensionato. Se metto il pannello all'interno di un altro pannello usando il layout del flusso, posso mantenere le etichette centrate orizzontalmente ma non verticalmente. Quale gestore di layout mi consentirà di mantenere il pannello centrato nel mezzo dello schermo?Centro verticale di gestione layout Java

Ho anche provato il layout del bordo e lo ho posizionato al centro ma si ridimensiona alle dimensioni della finestra.

risposta

20

Provare a utilizzare un GridBagLayout e aggiungere il pannello con un oggetto vuoto GridBagConstrants.
Per esempio:

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

Mi sono sempre chiesto come fare questo, alla fine ho rinunciato e usato MigLayout invece. – gencoreoperative

+4

Questo è ciò che penso di gridbag: http://madbean.com/anim/totallygridbag/ :) – qben

+0

GridBagLayout non riesce HARD quando il contenitore è più piccolo della dimensione preferita (ma più grande della dimensione minima) del bambino. –

9

In primo luogo, vorrei ricordare, leggere il mio articolo su layout: http://web.archive.org/web/20120420154931/http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/. E 'vecchio ma molto utile (purtroppo questo articolo pre-date BoxLayout Ho alcune diapositive quando ho dato quel discorso alla JavaOne, che comprende BoxLayout a http://javadude.com/articles/javaone.)

Prova BoxLayout:

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

e se si vuole per centrare quella roba, utilizzare un HorizontalBox come stuffToCenterVertically:

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

modo più semplice per "vedere" nel codice di GridBag

+1

Concordo sul fatto che GridBagLayout è generalmente più complesso, ma per centrare un singolo pannello, sono solo due righe. –

+0

Il problema è che non si può "vedere" ciò quando si legge il codice ... (Ho modificato la mia risposta allo stato "vedere" piuttosto che "più semplice" ...) –

+0

I "vedere" ... Ma sul L'altra mano "createVerticalGlue()" non significa niente nemmeno per me, senza leggere i documenti. –

0

GroupLayout sul pannello stesso, con GroupLayout.Alignment.CENTER, sia verticale che orizzontale e setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight)) per impostare il pannello su non ridimensionare.

Si potrebbe anche impostare setMinimumSize e setMaximum sul pannello, per sicurezza.

Se ti senti snazzy, puoi semplicemente utilizzare un solo GroupLayout per l'intera operazione, scegliendo accuratamente i gruppi parallelo/sequenziale e raggruppando le etichette in modo appropriato.

0

È possibile creare il proprio LayoutManager per centrare un singolo componente (entrambi gli assi o solo uno). Ecco quello che lo fa su entrambi gli assi, puoi facilmente cambiarlo per avere il centraggio verticale o orizzontale.

I layout di implementazione attuale primo figlio visibile, è possibile cambiare anche quello ...

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

sfortunatamente, questo non funziona per me. Ottengo uno stack overflow (haha) nel metodo 'preferredLayoutSize'. – Atmocreations

Problemi correlati