![](/img/trans.png)
[英]java - How would I dynamically add swing component to gui on click?
[英]Dynamically add swing component to gui on click?
从理论上讲,当添加这样的新组件时
JButton buttonAdd= new JButton("Add More");
buttonAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel.add(new JComboBox<String>(data);
panel.add(new JTextField();
}
});
如果您没有以正常方式声明它,是否可以使用getSelectedIndex()或getText() ?
是的,您可以通过这种方式将Swing组件添加到容器中。 但是,您需要在面板上调用revalidate
,否则它们可能不会立即显示。
如果在创建这些组件后需要访问它们,请将构造函数返回的值分配给在类内部声明的对象的字段。 您不能在调用方法中分配变量,因为构造函数是从内部类调用的。
有几种方法可以将动态添加的组件添加到摆动树:
第一种方法:
panel.getComponent(n);
返回面板中的第n个组件(容器)。 (n是该组件添加到其父组件的顺序(父组件在此处是panel
))(您需要知道组件的索引)可以使用((JComboBox)panel.getComponent(3)).getSelectedIndex()
第二种方法
动态添加组件时直接添加一些侦听器;
JButton b1 = new JButton("add");
b1.addActionListener(e -> {
JComboBox<String> color = new JComboBox<String>();
color.addActionListener(x -> { myFormBean.setColor(color.getSelectedItem();) });
panel.add(color);
JTextField name = new JTextField();
name.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
myFormBean.setName(name.getText());
}
@Override
public void insertUpdate(DocumentEvent e) {
myFormBean.setName(name.getText());
}
@Override
public void changedUpdate(DocumentEvent e) {
myFormBean.setName(name.getText());
}
});
panel.add(name);
panel.revalidate();
panel.repaint();
});
这样,您无需访问动态添加的组件。
第三种方法可能是使用框架进行数据绑定,
第四种方法 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.