2011-08-24 19 views
13

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 JPan 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.Centratura di una JLabel su un JPanel

sto male abbastanza cercando di gestire i layout me stesso, ma dal momento che il NetBeans GUI Builder genera automaticamente il codice immutabile, è stato impossibile per me capire come fare questo centratura, e non sono stato in grado di trovare qualsiasi cosa online aiutarmi.

Grazie a chiunque possa guidarmi nella giusta direzione!

risposta

11

Utilizzando Borderlayout, è possibile inserire uno qualsiasi dei JComponents nell'area CENTRO. Per un esempio, vedere an answer to Stack Overflow question Get rid of the gap between JPanels. Questo dovrebbe funzionare.

+0

grazie per la risposta, tuttavia la build GUI NetBeans utilizza GroupLayout e questo non è sovrascrivibile. Ricorda che non sto solo cercando di combattere Swing e il suo minaccioso LayoutManager, sto combattendo contro un generatore di GUI che genera automaticamente il codice specifico per GroupLayout! – IAmYourFaja

+0

+1: BorderLayout è quello corretto. – Heisenbug

+0

@Mara: ti consiglio davvero di iniziare a imparare come usare il gestore di layout. Non è così difficile. Invece è difficile ottenere gli stessi risultati usando Gui Builder. – Heisenbug

10

Anche con BoxLayout è possibile ottenere che: soluzione

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()); 

di mKorbel è perfetto per il tuo obiettivo. Ad ogni modo, mi piace sempre suggerire BoxLayout perché è molto flessibile.

+0

Grazie Overbose, ma sono bloccato con GroupLayout. E se trascorro molto più tempo sul lato client, prenderò sicuramente il tuo suggerimento e imparerò i LayoutManager da zero. Sto solo cercando una soluzione rapida e sporca. Che utilizza GroupLayout. – IAmYourFaja

+2

* "Sono bloccato con GroupLayout" * Solo perché non sai come usare Netbeans. Non lo uso, ma ho visto il codice dagli utenti di Netbeans (anche quando si utilizza il designer della GUI) che ha utilizzato tutti i layout standard. –

26

Qui ci sono quattro modi per centrare una componente:

4 Centered Components

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); 
      } 
     }); 
    } 
} 
+2

eccellente dopo l'aggiornamento +1 – mKorbel

6

Mara: "Grazie per la risposta, ma il NetBeans GUI build usa GroupLayout e questo non è override"

Non è vero! Fare clic con il pulsante destro del mouse in qualsiasi punto all'interno di JFrame (o qualsiasi altro contenitore della GUI) nel builder della GUI NetBeans e selezionare "Imposta layout". Di default è selezionato "Disegno libero", che è il layout di gruppo, ma è possibile selezionare qualsiasi altro layout incluso il layout del bordo come consigliato da mKorbel.