2009-04-17 4 views
107

У меня есть класс Java JFrame, в котором я хочу использовать boxlayout, но получаю сообщение об ошибке java.awt.AWTError: BoxLayout can't be shared. Я видел других с этой проблемой, но они решили это, создав boxlayout на contentpane, но это то, что я здесь делаю. Вот мой код:BoxLayout не может быть общей ошибкой

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

ответ

156

Ваша проблема заключается в том, что вы создаете BoxLayout для JFrame (this), но установить его в качестве макета для JPanel (getContentPane()). Попробуйте:

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

Спасибо, работал отлично: D – 2009-04-17 17:27:54

+1

Конечно, вам не нужно первый getContentPane ... :-) –

+5

Да, но удаление было бы запутать вопрос, теперь не так ли? –

61

Я также нашел эту ошибку, делая это:

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

JPanel не инициализированы при прохождении его в BoxLayout. Так разделите эту строку следующим образом:

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

Это будет работать.

+0

просто столкнулся с этим. благодаря! – anon58192932

+0

Только что получил эту же проблему, спасибо – Darc

+0

ДА СПАСИБО: D –

13

Я думаю, что одна важная вещь, чтобы выделить из предыдущих ответов, что целью BoxLayout (в первый параметр) должен быть тот же контейнер, что метод setLayout вызывается при, как в следующем примере:

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

Хороший принцип =] – dmonopoly

0

Если вы используете макет на JFrame как:

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

контроль фактически добавляется к ContentPane так он будет выглядеть это «общий» между JFrame и ContentPane

ли это вместо:

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