Centraggio di una JLabel su un JPanel

Sto usando il builder della GUI NetBeans per gestire il mio layout (sono terribile con LayoutManager) e sto provando a posizionare un JLabel semplice in modo che sia sempre centrato (orizzontalmente) all’interno del suo JPanel principale. Idealmente, questo sarebbe valido anche se JPanel fosse ridimensionato, ma se è una quantità pazzesca di codice piuttosto che essere sufficiente centrare quando JPanel viene creato per la prima volta.

Sto abbastanza male cercando di gestire i layout da solo, ma dal momento che il NetBeans GUI Builder genera codice immutabile, è stato imansible per me capire come fare questo centraggio, e non sono stato in grado di trovare nulla online per aiutarmi.

Grazie a chiunque possa guidarmi nella giusta direzione!

Usando Borderlayout , puoi mettere uno qualsiasi di JComponents nell’area CENTER. Per un esempio, vedere una risposta alla domanda Stack Overflow Eliminare il divario tra JPanels . Questo dovrebbe funzionare.

Ecco quattro modi per centrare un componente:

4 componenti centrati

 import java.awt.*; import javax.swing.*; import javax.swing.border.*; class CenterComponent { public static JLabel getLabel(String text) { return getLabel(text, SwingConstants.LEFT); } public static JLabel getLabel(String text, int alignment) { JLabel l = new JLabel(text, alignment); l.setBorder(new LineBorder(Color.RED, 2)); return l; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JPanel p = new JPanel(new GridLayout(2,2,4,4)); p.setBackground(Color.black); p.setBorder(new EmptyBorder(4,4,4,4)); JPanel border = new JPanel(new BorderLayout()); border.add(getLabel( "Border", SwingConstants.CENTER), BorderLayout.CENTER); p.add(border); JPanel gridbag = new JPanel(new GridBagLayout()); gridbag.add(getLabel("GridBag")); p.add(gridbag); JPanel grid = new JPanel(new GridLayout()); grid.add(getLabel("Grid", SwingConstants.CENTER)); p.add(grid); // from @0verbose JPanel box = new JPanel(); box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS )); box.add(Box.createHorizontalGlue()); box.add(getLabel("Box")); box.add(Box.createHorizontalGlue()); p.add(box); JFrame f = new JFrame("Streeeetch me.."); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setContentPane(p); f.pack(); f.setLocationByPlatform(true); f.setVisible(true); } }); } } 

Anche con BoxLayout puoi ottenere ciò:

 JPanel listPane = new JPanel(); listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS )); JLabel label = new JLabel(); listPane.add(Box.createHorizontalGlue()); listPane.add(label); listPane.add(Box.createHorizontalGlue()); 

La soluzione di mKorbel è perfetta per il tuo objective. Ad ogni modo, mi piace sempre suggerire BoxLayout perché è molto flessibile.

Mara: “Grazie per la tua risposta, tuttavia la Build GUI di NetBeans utilizza GroupLayout e questo non è sovrascrivibile.”

Non vero! Fare clic con il tasto destro in qualsiasi punto all’interno di JFrame (o qualsiasi altro contenitore della GUI) nel generatore di GUI NetBeans e selezionare “Imposta layout”. Di default è selezionato “Disegno libero”, che è il layout di gruppo, ma è ansible selezionare qualsiasi altro layout incluso il layout del bordo come consigliato da mKorbel.

Ci sono molti modi per farlo, a seconda del / i gestore / i di layout che usi. Ti suggerisco di leggere il tutorial Laying Out Components Within a Container .

Credo che quanto segue funzionerà, indipendentemente dal gestore di layout:

JLabel.setHorizontalAlignment(SwingConstants.CENTER)