2009-04-17 19 views
107

Mam tej klasy Java JFrame, w którym chcę użyć boxlayout, ale pojawia się błąd informujący o java.awt.AWTError: BoxLayout can't be shared. Widziałem innych z tym problemem, ale rozwiązali go, tworząc boxlayout na poziomie treści, ale to właśnie tutaj robię. Oto mój kod:BoxLayout nie może być udostępniony błąd

class edit_dialog extends javax.swing.JFrame{ 
    javax.swing.JTextField title = new javax.swing.JTextField(); 
    public edit_dialog(){ 
     setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE); 
     setTitle("New entity"); 
     getContentPane().setLayout(
      new javax.swing.BoxLayout(this, javax.swing.BoxLayout.PAGE_AXIS)); 
     add(title); 
     pack(); 
     setVisible(true); 
    } 
} 

Odpowiedz

156

Twoim problemem jest to, że podczas tworzenia BoxLayout dla JFrame (this), ale ustawienie go jako układ dla JPanel (getContentPane()). Spróbuj:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS) 
); 
+0

Dzięki, pracował idealnie: D –

+1

Oczywiście nie trzeba pierwszy getContentPane ... :-) –

+5

Tak, ale usunięcie byłoby pomylić problem, teraz prawda? –

61

Ja również znaleźć ten błąd czyniąc to:

JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 

JPanel nie jest zainicjowany jeszcze kiedy przekazaniem go do BoxLayout. Podziel tę linię tak:

JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 

To zadziała.

+0

właśnie w to wpadł. dzięki! – anon58192932

+0

Właśnie dostałem ten sam problem, dziękuję – Darc

+0

TAK DZIĘKUJĘ: D –

13

myślę, że jedna ważna rzecz, aby wyróżnić się od poprzednich odpowiedzi jest, że cel BoxLayout (pierwszy parametr) powinna być taka sama Pojemnik że metoda setLayout jest wezwany, jak w poniższym przykładzie:

JPanel XXXXXXXXX = new JPanel(); 
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS)); 
+0

Dobra zasada =] – dmonopoly

0

Jeśli używasz układu na zasadzie JFrame jak:

JFrame frame = new JFrame(); 
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS)); 
frame.add(new JLabel("Hello World!")); 

sterowanie jest faktycznie dodawana do ContentPane tak będzie wyglądać to „wspólna” między JFrame i ContentPane

Czy to zamiast:

JFrame frame = new JFrame(); 
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); 
frame.add(new JLabel("Hello World!")); 
Powiązane problemy