繁体   English   中英

在点击时动态地将swing组件添加到gui?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM