Ответ 1
Ваша проблема в том, что вы создаете BoxLayout
для JFrame
(this
), но устанавливаете его как макет для JPanel
(getContentPane()
). Попробуйте:
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
У меня есть этот класс Java JFrame
, в котором я хочу использовать boxlayout, но я получаю сообщение об ошибке java.awt.AWTError: BoxLayout can't be shared
. Я видел других с этой проблемой, но они решили это, создав boxlayout на contentpane, но это то, что я здесь делаю. Здесь мой код:
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);
}
}
Ваша проблема в том, что вы создаете BoxLayout
для JFrame
(this
), но устанавливаете его как макет для JPanel
(getContentPane()
). Попробуйте:
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
Я также нашел эту ошибку:
JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
JPanel еще не инициализируется при передаче его в BoxLayout. Так разделите эту строку следующим образом:
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
Это будет работать.
Я думаю, что одна важная вещь, которую следует выделить из предыдущих ответов, состоит в том, что цель BoxLayout (первый параметр) должна быть тем же Контейнером, на который вызывается метод setLayout, как в следующем примере:
JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));
Если вы используете макет на 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!"));