2011-03-17 16 views
5

Mam pasek na górze mojej aplikacji, która ma wiele przycisków po obu stronach JLabel. Widoczność przycisku zależy od bieżącego zadania wykonywanego przez użytkownika i jeden z tekstów przycisku może również zmieniać się w zależności od bieżącego stanu.Wyrównanie Java JLabel w centrum JPanel

Chciałbym mieć kilka przycisków na lewo od JPanel, centrum JLabel, które znajduje się w samym centrum JPanel, a pozostałe przyciski na prawo od JPanel .

Do tej pory udało mi się uzyskać przyciski w lewo i w prawo przy użyciu różnych metod i menedżerów układu, ale nie mogę sprawić, aby centrum JLabel znajdowało się w martwym centrum JPanel. Najlepsze, co udało mi się zdobyć, to etykieta wystarczająco blisko centrum, ale wtedy poruszałaby się, ponieważ przyciski są ustawione na widoczne lub zmieniają się ich teksty.

Czy można zmusić JLabel do pozostania martwym centrum?

Uwaga: przyciski nigdy nie staną się wystarczająco duże, aby spełnić krawędź JLabel, więc nie stanowi to problemu.

Odpowiedz

3

Jak widzę to trzeba etykiety mają być wyświetlane na jego korzystne rozmiar, a następnie potrzebny jest lewy i prawy panel, aby w równym stopniu wypełnić pozostałe wolne miejsce w oknie.

Można użyć klasy Relative Layout.

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

public class RelativeSSCCE extends JPanel 
{ 
    public RelativeSSCCE() 
    { 
     JPanel left = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
     left.add(new JButton("L1")); 
     left.add(new JButton("L2")); 
     left.add(new JButton("L3")); 

     JLabel center = new JLabel("Centered"); 

     JPanel right = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
     right.add(new JButton("Right1")); 
     right.add(new JButton("Right2")); 
     right.add(new JButton("Right3")); 

     // choose your layout manager here 

     setLayout(new RelativeLayout()); 
     Float ratio = new Float(1); 
     add(left, ratio); 
     add(center); 
     add(right, ratio); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Basic RelativeSSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new RelativeSSCCE()); 
     frame.setSize(600, 100); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

Mam jeszcze spróbować układ względny, ale GridBagLayout ma taki sam problem jak BorderLayout. Panele lewy i prawy nie mają jednakowej szerokości, więc środkowy panel nie jest naprawdę wycentrowany. – Bassetts

+0

RelativeLayout działał przyjemnie, wolałby użyć domyślnego menedżera układu, ale wygląda na to, że nie poradzi sobie z tym, co wydaje się być trywialnym zadaniem. Dzięki. – Bassetts

3

Użyj BorderLayout. Dodaj JLabel z ograniczeniem BorderLayout.CENTER i dodaj parę JPaneli z ograniczeniami BorderLayout.EAST i BorderLayout.WEST. Dodaj dodatkowe przyciski do odpowiedniego JPanel.

Aby tekst wyglądał na wyśrodkowany, należy również ustawić poziomą etykietę Label na JLabel.CENTER.

+0

Próbowałem tego, ale ponieważ panele wschodni i zachodni nie mają równych rozmiarów, liczba przycisków w panelach i tekst na przyciskach może się zmienić, środek nie jest faktycznie wyśrodkowany w głównym panelu. – Bassetts

7

Można również użyć BoxLayout z X_AXIS układ i dodać do pojemnika

Edycja: Oto przykład

panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
panel.add(Box.createHorizontalGlue()); 
panel.add(innerPanel); 
panel.add(Box.createHorizontalGlue()); 
+0

Nie wiem, jak to się udało, ale sprawdziło się świetnie! + To proste. –

+0

Po prostu okazało się, że działa to tylko wtedy, gdy 'panel' ma minimalny i maksymalny rozmiar ustawiony na preferowany rozmiar. –

0

może być I`m necroposting, ale setAlignmentX (java.awt.Component.CENTER_ALIGNMENT) i setAlignmentY (java.awt.Component.CENTER_ALIGNMENT) może pomóc ...

2
setAlignmentX(java.awt.Component.CENTER_ALIGNMENT) 

i

setAlignmentY(java.awt.Component.CENTER_ALIGNMENT) 

może pomóc w przypadku użycia z elementami, które muszą być wyśrodkowane, np. JPanel