Как динамически добавлять панели к другим панелям во время выполнения в Java? - PullRequest
10 голосов
/ 04 октября 2008

Я пытаюсь снова попасть в Java (это было несколько лет). Я никогда не делал GUI-кодирование в Java. Я использовал Netbeans, чтобы начать с этим.

При использовании winforms в C # на работе я использую usercontrols для создания частей моего интерфейса и динамического добавления их в формы.

Я пытался использовать JPanels как usercontrols в C #. Я создал JPanel форму под названием BlurbEditor. Это имеет несколько простых элементов управления. Я пытаюсь добавить его на другую панель во время выполнения события кнопки.

Вот код, который я думал, будет работать:

mainPanel.add(new BlurbEditor());
mainPanel.revalidate();
//I've also tried all possible combinations of these too
//mainPanel.repaint();
//mainPanel.validate();

Это, к сожалению, не работает. Что я делаю не так?

Ответы [ 6 ]

17 голосов
/ 04 октября 2008

Я понял это. Комментарии под принятым ответом здесь объясняют это: Динамически добавленная JTable не отображается

В основном я только что добавил следующее перед mainPanel.add ()

mainPanel.setLayout(new java.awt.BorderLayout());
5 голосов
/ 04 октября 2008
Компоненты

Swing/AWT обычно должны иметь макет, прежде чем что-то добавлять к ним, иначе UI не будет знать, где размещать подкомпоненты.

BFreeman предложил BorderLayout, который является одним из самых простых в использовании и позволяет вам «склеивать» вещи сверху, снизу, слева, справа или по центру родителя.

Существуют и другие, такие как FlowLayout, который похож на textarea - он добавляет компоненты слева направо вверху родительского элемента и переносится на новую строку, когда достигает конца.

GridBagLayout, который всегда был печально известен тем, что его невозможно выяснить, но дает вам почти весь контроль, который вам необходим. Немного похоже на те HTML таблицы, которые мы привыкли видеть со странными комбинациями атрибутов rowspan, colspan, width и height - которые никогда не выглядели совсем так, как вы хотели.

0 голосов
/ 26 октября 2013

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

parentPanel: содержит панель, которую мы хотим удалить
childPanel: панель, которую мы хотим переключить
parentPanelLayout: макет parentPanel
editParentLayout (): создает parentPanel с разными childPanel и NEW parentPanelLayout каждый раз

parentPanel.remove(childPanel); 
editParentLayout();
parentPanel.revalidate();
parentPanel.repaint();
0 голосов
/ 22 октября 2010

mainPanel.add (новый BlurbEditor ());

mainPanel.validate ();

mainPanel.repaint ();

0 голосов
/ 04 октября 2008

Как и для всех свинг-кодов, не забудьте вызвать любое обновление графического интерфейса в потоке отправки событий. См. this , почему вы должны делать такие обновления

// Do long running calculations and other stuff outside the event dispatch thread
while (! finished )
  calculate();
SwingUtilities.invokeLater(new Runnable(){
  public void run() {
    // update gui here
  }
}
0 голосов
/ 04 октября 2008

Попробуйте mainPanel.invalidate(), а затем, если необходимо, mainPanel.validate(). Возможно, стоит проверить, что вы делаете все это в потоке отправки событий, иначе ваши результаты будут точными и (как правило) недетерминированными.

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