纯粹在理论上添加像
这样的新组件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()?
答案 0 :(得分:0)
是的,您可以通过这种方式将Swing组件添加到容器中。但是,您需要在面板上调用revalidate
,否则它们可能不会立即显示。
如果需要在创建这些组件后访问它们,请将构造函数返回的值分配给在类中声明的对象字段。您无法在调用方法中分配变量,因为从内部类调用构造函数。
答案 1 :(得分:0)
有几种方法可以实现动态添加的组件来摆动树:
第一种方法:
panel.getComponent(n);
返回面板中的第n个组件(Container)。 (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();
});
这样您就不需要访问动态添加的组件了。
第3种方法可能正在使用数据绑定框架,
第4种方法 ......