Java Swing: dispose () JFrame не очищает свои элементы управления - PullRequest
4 голосов
/ 10 января 2010

У меня есть метод closeWindow (), который использует dispose () для закрытия текущего JFrame. Когда я снова показываю окно, элементы управления (текстовые поля, списки, таблицы и т. Д.) По-прежнему имеют свои прежние значения, которые были там, когда я удалял (): d кадр ... Почему это так? Есть ли другой способ полностью закрыть и очистить кадр?

Это код, который другой JFrame использует для отображения другого окна, я что-то здесь не так делаю?

@Action
public void showAddProductToOrderView() {

    if (addProductToOrderView == null) addProductToOrderView = new AddProductToOrderView(this);
    addProductToOrderView.setVisible(true);
}

Ответы [ 2 ]

5 голосов
/ 10 января 2010

Удаление окна не очистит его дочерние текстовые компоненты. Утилизация освободит родные ресурсы. В javadoc для java.awt.Window также указано:

Окно и его подкомпоненты можно снова сделать отображаемыми, перестроив собственные ресурсы с последующим вызовом pack или show. Состояния воссозданного Окна и его подкомпонентов будут идентичны состояниям этих объектов в точке, где Окно было расположено (без учета дополнительных изменений между этими действиями).

Как советуют другие, каждый раз вместо этого создавайте новый экземпляр. Если это дорого, я думаю, что ваш лучший вариант - очистить подкомпоненты, когда представление станет видимым, например, переопределив setVisible.

EDIT: Снимите нулевую проверку, чтобы каждый раз создавать новый кадр.

@Action
public void showAddProductToOrderView() {
    addProductToOrderView = new AddProductToOrderView(this);
    addProductToOrderView.setVisible(true);
}

Я не знаю об остальной части вашего кода, есть ли что-то еще, зависящее от повторного использования фрейма. Например, если вы подключили прослушиватели, убедитесь, что они не зарегистрированы, чтобы не пропустить их.

3 голосов
/ 10 января 2010

Самое простое, что можно сделать, - это заново создать весь кадр (используя его конструктор), прежде чем использовать show(), чтобы снова его отобразить. Это даст вам совершенно новый набор компонентов, при условии, что конструктор создает и размещает их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...