BoxLayout не может быть общей ошибкой - PullRequest
111 голосов
/ 17 апреля 2009

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

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

Ответы [ 4 ]

166 голосов
/ 17 апреля 2009

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

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
71 голосов
/ 27 июля 2010

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

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

JPanel еще не инициализируется при передаче его в BoxLayout. Итак, разбейте эту строку следующим образом:

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

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

16 голосов
/ 08 сентября 2011

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

JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));
2 голосов
/ 13 декабря 2017

Если вы используете макет на 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!"));
...