2013-10-11 76 views
1

我想知道如何动态地将组件添加到JDialog。我知道在SO here上有类似的问题,但正如你所看到的,我将他的解决方案作为我的代码的一部分。动态地将组件添加到按钮单击的JDialog上

所以这个想法是,点击按钮,我需要在对话框中添加一个组件。该示例代码如下:

import java.awt.Container; 
import java.awt.Dialog; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
public class Test extends JFrame { 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

public static void main(String args[]) { 
    Test test = new Test(); 
    test.createDialog(); 
} 

public void createDialog() { 
    DynamicDialog dialog = new DynamicDialog(this); 
    dialog.setSize(300, 300); 
    dialog.setVisible(true); 
} 
} 

class DynamicDialog extends JDialog { 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

public DynamicDialog(final JFrame owner) { 
    super(owner, "Dialog Title", Dialog.DEFAULT_MODALITY_TYPE); 
    final JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

    final JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
    panel.add(Box.createRigidArea(new Dimension(3, 10))); 
    panel.add(createLabel("Click on add")); 
    panel.add(Box.createRigidArea(new Dimension(23, 10))); 
    panel.add(createLabel("To add another line of text")); 
    panel.add(Box.createHorizontalGlue()); 
    mainPanel.add(panel); 
    mainPanel.add(Box.createRigidArea(new Dimension(3, 10))); 

    JPanel buttonPanel = new JPanel(); 
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS)); 
    buttonPanel.add(Box.createHorizontalGlue()); 

    JButton button = new JButton(); 
    button.setText("Add another line"); 
    buttonPanel.add(button); 
    mainPanel.add(buttonPanel); 
    mainPanel.add(Box.createRigidArea(new Dimension(3, 10))); 

    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      Container contentPane = owner.getContentPane(); 
      JPanel _panel = new JPanel(); 
      _panel.setLayout(new BoxLayout(_panel, BoxLayout.X_AXIS)); 
      _panel.add(Box.createHorizontalGlue()); 
      _panel.add(createLabel("Added!")); 
      contentPane.add(_panel); 

      contentPane.validate(); 
      contentPane.repaint(); 
      owner.pack(); 
     } 
    }); 

    pack(); 
    setLocationRelativeTo(owner); 
    this.add(mainPanel); 
} 

JLabel createLabel(String name) { 
    JLabel label = new JLabel(name); 
    return label; 
} 
} 

回答

3

如果你把它添加到主面板,将工作,你将它添加到它似乎它不显示任何地方帧的内容窗格中。

button.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent event) { 

     JPanel _panel = new JPanel(); 
     _panel.setLayout(new BoxLayout(_panel, BoxLayout.X_AXIS)); 
     _panel.add(Box.createHorizontalGlue()); 
     _panel.add(createLabel("Added!")); 
     mainPanel.add(_panel); 

     mainPanel.validate(); 
     mainPanel.repaint(); 
     owner.pack(); 
    } 
}) 
+0

非常感谢,真的很有帮助! –

+0

虽然如果您必须使用'owner.pack()',那么不需要显式调用child.validate/revalidate和child.repaint,因为这可以通过调用来隐式完成'包'对所有者:-) +1 :-) –

相关问题