2012-03-22 16 views
10

Mam panel wyprowadzony z JPanel. Mam niestandardową kontrolę pochodzącą z JLabel. Próbuję wyśrodkować ten niestandardowy JLabel na moim panelu.Wyśrodkowanie JLabel w JPanel

Jedyny sposób, w jaki mogę to zrobić, to użyć układu pustego (setLayout(null)), a następnie obliczyć niestandardowy punkt JLabel o wartości setLocation(), tak aby znalazł się we właściwym miejscu.

Niestandardowy JLabel został fizycznie przeniesiony z jednego panelu do tego panelu w tej aplikacji i uważam, że lokalizacja wcześniej ustawiona w setLocation wpływa na rzeczy. Jednak gdy ustawię go na (0,0), komponent znajdzie się w lewym górnym rogu.

BorderLayout nie działa, ponieważ gdy tylko 1 komponent jest dostarczony i umieszczony w BorderLayout.CENTER, środkowa sekcja rozszerza się, aby wypełnić całą przestrzeń.

Przykład wycinany i wklejany z innej witryny używanej pod BoxLayout i component.setAlignmentX(Component.CENTER_ALIGNMENT). To też nie działa.

Inna odpowiedź wspomniała o nadpisaniu funkcji panelu getInset() (myślę, że tak się nazywał), ale to okazało się ślepym zaułkiem.

Do tej pory pracuję z panelem o układzie GridBagLayout i dołączam obiekt GridBagConstraints po wstawieniu niestandardowego JLabel do mojego panelu. Jest to jednak nieefektywne. Czy istnieje lepszy sposób wyśrodkowania JLabel w moim JPanel?

+8

Zastanów się nad wydobyciem faktycznego pytania z tantiem. –

+0

Aha, i po użyciu metody GridBagLayout i GridBagConstraints rzeczy wyglądają dobrze, jeśli minimalizuję, a następnie przywracam główne okno. – Shackleford

+2

Czas na napisanie tego całego tłumaczenia był wystarczający do wpisania google 'Swing przy pracy z menedżerami layoutów', kliknięciu pierwszego hitu oficjalnych tutoriali swingowych, obejrzeniu wizualnego przewodnika, zdecydowania BoxLayout wygląda obiecująco i zobaczenia przykładu, który robi więcej lub mniej tego, co chcesz (zawiera dwa komponenty pojedyncze) – Robin

Odpowiedz

8

BoxLayout jest drogą do zrobienia. Jeśli założyć X_AXIS BoxLayout, spróbuj dodać kleje poziome przed i po składniku:

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

Zapomnij wszystkie LayoutManagers w Java Standard Library i używać MigLayout. Z mojego doświadczenia wynika, że ​​praca z nim jest o wiele łatwiejsza niż zwykle.

Oto, jak osiągnąć to, co po użyciu 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); 
    } 
} 

Większość z nich to po prostu zestaw znaków. Kluczem jest ograniczenie układu: "push, align center":

align center mówi MigLayout, aby umieścić JLabel w centrum jego komórki siatki.

push mówi MigLayout, aby rozwinąć komórkę siatki, aby wypełnić dostępną przestrzeń.

+0

Istnieje świetny arkusz do ściągania MigLayout dostępny pod adresem: http://migcalendar.com/miglayout/mavensite/docs/cheatsheet.html – ulmangt

+0

Możesz pobrać najnowszą wersję MigLayout stąd: http://www.migcalendar.com/miglayout /versions/4.0/miglayout-4.0-swing.jar – ulmangt

+0

Interesujące! Dzięki za wskazówkę, będę musiał o tym pamiętać na przyszłość, ale na razie mam nadzieję pozostać w bibliotekach Java dla rzeczy. Nadal jestem bardzo nowy i próbuję się uczyć. – Shackleford

23

Set GridBagLayout dla JPanel umieścić JLabel bez GridBagConstraints do JPanel, JLabel zostaną skupione

enter image description here

przykładowy

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

Dziękuję, mKorbel, za nie tylko zamieszczanie użytecznych informacji, ale także ich dokładną pracę. Niestety utkwiło mnie to w tej samej sytuacji, w której mam nieoczekiwane zachowanie (nic nie pojawia się w moim panelu po umieszczeniu mojego JLabel). Kiedy wstawiłem twój przykład do mojego rzeczywistego kodu i użyłem manekina JButton, położenie JButton było idealne. Dodałem nawet pewne ustawienia do tego JButton, aby naśladować mój niestandardowy JLabel i nadal działało, ale kiedy użyłem mojego JLabel? Wtedy wszystko nie działa. Nie rozumiem tego. Musi być coś, co przeszkadza mojemu JLabel w robieniu tego, co robią te manekiny JButtons. – Shackleford

13

supose swój JLabel nazywa label, a następnie użyć:

label.setHorizontalAlignment(JLabel.CENTER); 
+0

Jest to zdecydowanie stary post, ale kiedy wracamy do Swinga na nowy projekt, był to zdecydowanie najprostszy i najbardziej na miejscu. Dlaczego nie jest to zaznaczone, odpowiedź jest poza mną. – Maxs728

+0

To jest złe. Wpływa na pozycję etykiety, a nie na pozycję etykiety w pojemniku. – Kroky