Дизайнер форм NetBeans: изменение макета после вызова initComponents

У меня есть класс, расширяющий javax.swing.JPanel, он содержит одну кнопку JButton. Я создал класс в дизайнере NetBeans. Таким образом, у меня есть функция initComponents(), которая вызывается из конструктора класса.

Что я хочу сделать, так это когда/если вызывается функция, я хочу добавить вторую кнопку и изменить расположение двух кнопок. Делаем просто:

public void addSecond() {
    javax.swing.JButton secondButton = new javax.swing.JButton();
    add(secondButton , java.awt.BorderLayout.CENTER);
}

Не работает, новая кнопка не появляется. Я также пытался позвонить invalidate(), но безуспешно.

  • Как вызвать повторную оценку макета?
  • Если указанная функция вызывается более одного раза, для каких частей макета/кнопок мне нужно вызвать dispose()? О какой-либо другой очистке мне следует беспокоиться?
  • Будет ли проще справиться с этим, если я не буду использовать конструктор NetBeans?

person Mizipzor    schedule 02.02.2010    source источник


Ответы (2)


Вам нужно установить макет панели, прежде чем добавлять кнопку с BorderLayout.CENTER. Кроме того, вы должны удалить и снова добавить первую кнопку и вызвать метод revalidate() на панели.

Измените метод addSecond(), как показано ниже, и он должен работать.

private void addSecond() {
    JButton secondButton = new JButton("Button - 2");

    this.setLayout(new BorderLayout());
    remove(firstButton);
    add(firstButton, BorderLayout.NORTH);
    add(secondButton, BorderLayout.CENTER);

    revalidate();
}
person Chandra Sekar    schedule 02.02.2010
comment
Я не знал, что мне нужно полностью воссоздать экземпляр макета, я изменю код. Спасибо. - person Mizipzor; 02.02.2010

когда вы изменили компоненты таким образом, что изменился макет, вам нужно снова вызвать менеджера макета, вызвав revalidate(). Вы можете вызывать его так часто, как хотите.
Для простых макетов может быть достаточно просто вызвать repaint().

И на самом деле, если вы не делаете динамически изменяющиеся панели (т.е. добавляете/удаляете компоненты на лету), вам следует использовать конструктор netbeans, чтобы все элементы Swing находились в одном месте.

-- ИЗМЕНИТЬ --
И вы можете поместить только один компонент в BorderLayout.CENTER на панель. Если вы поместите более одного элемента в одно и то же положение панели, то, что будет окрашено, не будет четко определено, т. Е. Это может быть любой из элементов (или оба).

person Stroboskop    schedule 02.02.2010