Конструктор форм NetBeans: изменение макета после вызова initComponents - PullRequest
2 голосов
/ 02 февраля 2010

У меня есть класс, который расширяет 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?

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Прежде чем добавить кнопку с помощью 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();
}
1 голос
/ 02 февраля 2010

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

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

- РЕДАКТИРОВАТЬ -
И вы можете поместить только один компонент в BorderLayout.CENTER для каждой панели. Если вы поместите более одного элемента в одну и ту же позицию панели, то, что будет окрашено, не будет четко определено, то есть это может быть один из элементов (или оба).

...