2012-03-22 3 views
10

Ho un pannello derivato da JPanel. Ho un controllo personalizzato derivato da JLabel. Sto tentando di centrare questa custom JLabel sul mio pannello.Centratura di una JLabel in un JPanel

L'unico modo per farlo funzionare è utilizzare il layout null (setLayout(null)) e quindi calcolare il punto setLocation() personalizzato di JLabel in modo che sia nel punto giusto.

La custom JLabel viene spostata fisicamente da un pannello a questo pannello in questa app e credo che la posizione precedentemente impostata in setLocation stia influenzando le cose. Tuttavia quando lo imposto su (0,0) il componente sale nell'angolo in alto a sinistra.

BorderLayout non funziona perché quando viene fornito solo 1 componente e inserito in BorderLayout.CENTER, la sezione centrale si espande per riempire tutto lo spazio.

Un esempio che ho tagliato e incollato da un altro sito utilizzato BoxLayout e component.setAlignmentX(Component.CENTER_ALIGNMENT). Questo non ha funzionato neanche.

Un'altra risposta ha menzionato la funzione getInset() del pannello (penso sia quello che è stato chiamato), ma si è rivelato un vicolo cieco.

Finora sto lavorando con un pannello con un layout GridBagLayout e includo un oggetto GridBagConstraints quando inserisco l'JLabel personalizzato nel pannello. Questo è inefficiente, però. C'è un modo migliore per centrare il JLabel nel mio JPanel?

+8

Prendere in considerazione l'estrazione della domanda dal ranting. –

+0

Oh, e dopo aver usato il metodo GridBagLayout e GridBagConstraints, le cose sembrano OK se minimizzo e poi ripristino la finestra principale. – Shackleford

+2

Il tempo di scrivere questo intero rant è stato sufficiente per digitare in google "Swing che lavora con i gestori di layout", fare clic sul primo colpo dei tutorial swing ufficiali, guardare la guida visiva, decidere BoxLayout sembra promettente e vedere un esempio che fa di più o meno quello che vuoi (contiene due componenti iso uno solo) – Robin

risposta

8

BoxLayout è la strada da percorrere. Se si imposta un X_AXIS BoxLayout, prova ad aggiungere colle orizzontali, prima e dopo che il componente:

panel.add(Box.createHorizontalGlue()); 
panel.add(label); 
panel.add(Box.createHorizontalGlue()); 
7

dimenticare tutte le LayoutManagers nella libreria standard di Java e utilizzare MigLayout. Nella mia esperienza è molto più facile lavorare con un solito fa esattamente quello che ti aspetti che faccia.

Ecco come ottenere ciò che si desidera dopo aver utilizzato MigLayout.

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 

     // use MigLayout 
     panel.setLayout(new MigLayout()); 

     // add the panel to the frame 
     frame.add(panel); 

     // create the label 
     JLabel label = new JLabel("Text"); 

     // give the label MigLayout constraints 
     panel.add(label, "push, align center"); 

     // show the frame 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

La maggior parte di questo è solo il boilerplate. La chiave è il vincolo di layout: "push, align center":

align center dice a MigLayout di posizionare la JLabel al centro della sua cella di griglia.

push indica a MigLayout di espandere la cella della griglia per riempire lo spazio disponibile.

+0

C'è un ottimo cheat di MigLayout disponibile su: http://migcalendar.com/miglayout/mavensite/docs/cheatsheet.html – ulmangt

+0

Puoi scaricare l'ultima versione di MigLayout da qui: http://www.migcalendar.com/miglayout /versions/4.0/miglayout-4.0-swing.jar – ulmangt

+0

Interessante! Grazie per il suggerimento dovrò tenerlo a mente per il futuro, ma per ora spero di rimanere all'interno delle librerie Java per le cose. Sono ancora molto nuovo e sto cercando di imparare. – Shackleford

23

Set GridBagLayout per JPanel, messo JLabel senza GridBagConstraints al JPanel, JLabel sarà centrato

enter image description here

esempio

import java.awt.*; 
import javax.swing.*; 

public class CenteredJLabel { 

    private JFrame frame = new JFrame("Test"); 
    private JPanel panel = new JPanel(); 
    private JLabel label = new JLabel("CenteredJLabel"); 

    public CenteredJLabel() { 
     panel.setLayout(new GridBagLayout()); 
     panel.add(label); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       CenteredJLabel centeredJLabel = new CenteredJLabel(); 
      } 
     }); 
    } 
} 
+0

Grazie, mKorbel, per non solo pubblicare informazioni utili, ma farlo con tanta cura. Sfortunatamente questo mi ha bloccato nella stessa situazione in cui ho un comportamento inaspettato (non compare nulla nel mio pannello dopo aver posizionato la mia JLabel). Quando ho inserito il tuo esempio nel mio codice reale e ho usato un manichino JButton, il posizionamento di JButton era perfetto. Ho persino aggiunto alcune impostazioni a quel JButton per simulare la mia JLabel personalizzata e ha funzionato, ma quando ho usato il mio JLabel? Questo è quando le cose non funzionano. Non capisco Deve esserci qualcosa che impedisce alla mia JLabel di fare quello che fanno questi fantastici JButtons. – Shackleford

13

supose tua JLabel si chiama label, quindi utilizzare:

label.setHorizontalAlignment(JLabel.CENTER); 
+0

Questo è sicuramente un vecchio post, ma quando la rivisitazione di Swing per un nuovo progetto questa è stata sicuramente la risposta più semplice e scontata. Perché questo non è segnato la risposta è oltre me. – Maxs728

+0

Questo è sbagliato. Influisce sulla posizione del contenuto dell'etichetta, non sulla posizione dell'etichetta all'interno del contenitore. – Kroky