Swing: динамическое отображение панели - PullRequest
2 голосов
/ 16 февраля 2010

В настоящее время я создаю Java-графический интерфейс для свингера с помощью Netbeans GUI Builder. У меня есть несколько панелей, которые заменяются на моем главном JFrame, когда пользователь перемещается по GUI, и класс контроллера заботится об этом. На одном шаге, однако, есть панель (FilterDefinitionPanel), которая содержит поле со списком, а также пустую внутреннюю панель (QueryHelperPanel).

Что я хотел бы сделать, это заменить эту внутреннюю панель другой созданной мной (StringQueryDefinitionPanel) в зависимости от того, что пользователь выбирает в поле со списком. Итак, прямо сейчас под обработчиком событий ComboBoxItemStateChanged моего поля со списком у меня есть класс контроллера, запускающий этот метод:

 public void selectFilterAttribute(Object item) {
    /**
     * Determine panel to create based on item selection. Currently always returns the same
     * StringQueryDefinitionPanel.
     */
    JPanel panel = this.getRequiredQueryHelperPanel(item);
    /**
     * Swap the placeholder QueryHelperPanel with the required one.
     */
    ((FilterDefinitionPanel) this.mainFrame.getMainPanel()).setQueryHelperPanel(panel);
    /**
     * Not sure if all of these are needed :\
     */
    mainFrame.validate();
    mainFrame.repaint();
    mainFrame.pack();
}

Это то, что происходит в методе setQueryHelper панели FilterDefinitionPanel:

public void setQueryHelperPanel(JPanel panel){
    this.remove(queryHelperPanel);
    this.queryHelperPanel=panel;
    this.queryHelperPanel.repaint();
    /**
    * Again, not sure which refresh methods are needed...
    */
    this.validate();
    this.repaint(); 
}

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

Ответы [ 2 ]

7 голосов
/ 16 февраля 2010

Метод setQueryHelperPanel() не работает, поскольку он удаляет существующую панель из коллекции дочерних элементов this с помощью метода remove(), но затем не использует add() для добавления новой панели - присвоение ее переменная экземпляра не приводит к тому, что она становится дочерней.

Однако, более чистым решением для вашей проблемы будет использование CardLayout .

0 голосов
/ 16 февраля 2010

Спасибо за ответ.

Ранее я изучал CardLayout, но я стараюсь избегать его, поскольку, насколько я понимаю, он загружает все панели в памяти, а затем позволяет вам их поменять. Я хотел бы сохранить полный контроль над динамическим отображением панелей.

Забывать удаление было глупой ошибкой с моей стороны. Я действительно имел это раньше, но это все еще не работало. Это текущий метод обмена:

public void setQueryHelperPanel(JPanel panel){
    this.remove(queryHelperPanel);
    this.queryHelperPanel=panel;
    this.add(queryHelperPanel);
    this.queryHelperPanel.repaint();
    this.validate();
    this.repaint();
}

Я понимаю, что установка переменной экземпляра на самом деле не добавляет ее как дочернюю, но моя идея состояла в том, чтобы переменная использовалась, чтобы запомнить, какую панель удалить или добавить.

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