2014-01-30 3 views
0

У меня есть JPanel в приложении рабочего стола swing, содержащем компоненты, которые были выложены с использованием GUI-конструктора в NetBeans. В сгенерированном исходном коде NetBeans использует GroupLayout в качестве Менеджера макетов. Это JPanel находится в JScrollPane.Как добавить JPanel к существующему макету во время выполнения

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

Смотрите изображение ниже:

enter image description here

В изображении выше, есть JButton помеченный «Enter» красная линия ниже кнопки, где я хочу, чтобы моя новая панель появляется, когда кнопка щелкнул.

enter image description here

На рисунке выше показано, что происходит, когда я использовал метод GroupLayout.replace(Component existingComponent, Component newComponent), но я не хочу использовать метод замены, я не хочу, чтобы заменить существующую панель, я просто хочу, чтобы добавить новая панель к существующему расположению. Я не могу найти какой-либо метод в GroupLayout, который делает это. Пожалуйста помоги.

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

+0

можно просто поставить первый пустой и панель, а затем заменить с новой панелью .. –

ответ

0

Одним из решений является просто добавить пустую панель в пространство под красной линией. Увеличьте размер, который вы хотите. Затем, когда вы нажимаете кнопку, просто добавьте эту панель в уже существующую пустую панель и revalidate() и repaint(), пустую главную панель.

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

Решение 1.

private void jButtonXActionPerformed(java.awt.event.ActionEvent e){ 
    jPanelX.add(new MyOherPanel()); 
    jPanelX.revalidate(); 
    jPanelX.repaint(); 
} 

Решение 2.

MyPanel myPanel = null; 
public GUI(){ 
    intitComponents(); 
    jPanelX.setLayout(new CardLayout()); 
    jPanelX.add(new JPanel(), "emptyPanel"); 
    myPanel = new MyPanel(); 
    jPanelX.add(myPanel, "myPanel"); 
} 

... 
private void jButtonXActionPerformed(java.awt.event.ActionEvent e) { 
    CardLayout layout = (CardLayout)jPanelX.getLayout(); 
    layout.show(jPanelX, "myPanel"); 
} 
+0

Нет, я не хочу пустой существующей панели, чтобы быть там. – Jevison7x

+0

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

+0

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

1

Используйте этот код для замены новые JPanel к существующим JPanel. NewPanelClass - это класс, в котором размещается ваше новое текстовое поле Five, а jpanel1 - текущая пустая панель. так называемый CurrentPanel() в событии buttonclick, и вы можете легко разместить панель в пустой панели так же, как и в разделе «Структура группы».

private void CurrentPanel() 
    { 
     NewPanelClass mpanel = new NewPanelClass(); 
     this.getContentPane().remove(0); 
     jPanel1.removeAll(); 
     javax.swing.GroupLayout firstPanelLayout = new javax.swing.GroupLayout(jPanel1); 
     jPanel1.setLayout(firstPanelLayout); 
     firstPanelLayout.setHorizontalGroup(
       firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(firstPanelLayout.createSequentialGroup().addGap(1, 1, 1).addComponent(mExploredDBView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(714, Short.MAX_VALUE))); 
     firstPanelLayout.setVerticalGroup(
       firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(firstPanelLayout.createSequentialGroup().addGap(1, 1, 1).addComponent(mExploredDBView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addGap(1, 1, 1))); 
     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); 
     SwingUtilities.updateComponentTreeUI(this.getContentPane()); 
    } 

Спасибо ..

+0

Пожалуйста, где код для 'NewPanelClass'? – Jevison7x

+0

это ваш код панели, который имеет jtextfield, Jbutton и т. Д. Просто создайте одну панель из netbeans и замените это имя класса на newpanelclass. –

Смежные вопросы