java - 如何从 JPanel 组件(例如动态创建的下拉列表、文本字段)获取值

标签 java swing jframe

我有一个 JPanel,它由 JFrame 内的一个下拉列表和一个文本字段组成。我的 JFrame 中有一个按钮,当用户单击该按钮时,应用程序会添加具有相同组件的新 JPanel,即下拉菜单和文本字段。因此,为此我创建了一个函数,使用 ActionListener 单击按钮时会调用该函数。

从 GUI 端一切正常,但问题是当用户完成添加 JPanel 并在这些下拉列表和文本字段中输入值时,它将单击“提交”按钮。单击“提交”按钮后,我应该能够从所有下拉列表和文本字段中获取值。这是一个挑战,因为我使用相同的函数来创建 JPanel,我无法调用它的名称来获取值,因为这会给我最后一个 JPanel值。

有什么建议我应该如何去做吗?我添加了 JFrame 的屏幕截图和创建 JPanel 的函数。任何帮助表示赞赏。谢谢。

 public static void AddPanel(final Container pane) {

    panel1 = new JPanel();
    String text = "<html><b>Property" + nooftimes + " :</b></html>";
    JLabel label = new JLabel(text);
    label.setPreferredSize(new Dimension(80, 30));
    panel1.add(label);

    panel1.add(new JLabel("Please enter the property"));
    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>();
    model.addElement("value1");
    model.addElement("value2");
    model.addElement("value3");
    model.addElement("value4");
    model.addElement("value5");


    final JComboBox<String> comboBox1 = new JComboBox<String>(model);
    AutoCompleteDecorator.decorate(comboBox1);
    comboBox1.setPreferredSize(new Dimension(120, 22));
    panel1.add(comboBox1);

    final JTextField txtfield1 = new JTextField(
            "Please enter your value here");
    txtfield1.setPreferredSize(new Dimension(200, 22));
    panel1.add(txtfield1);

    txtfield1.addFocusListener(new FocusListener() {
        public void focusGained(FocusEvent e) {
            txtfield1.setText("");
        }

        public void focusLost(FocusEvent e) {
            // nothing
        }
    });
    container.add(panel1);
    nooftimes++;

    frame.revalidate();
    frame.validate();
    frame.repaint();
    }

截图: **frame_screenshot** }

最佳答案

您可以返回 JPanel并将其存储在List<JPanel>中。当您单击提交按钮时,您可以迭代 JPanel s 及其 Component s。

public class Application {

    private static List<JPanel> panels = new ArrayList<>();
    private static Container someContainer = new Container();

    public static void main(String[] args) {
        panels.add(addPanel(someContainer));
        panels.add(addPanel(someContainer));
        panels.add(addPanel(someContainer));

        submit();
    }

    public static JPanel addPanel(final Container pane) {
        JPanel panel1 = new JPanel();
        // shortened code
        final JComboBox<String> comboBox1 = new JComboBox<String>();
        panel1.add(comboBox1);

        final JTextField txtfield1 = new JTextField("Please enter your value here");
        txtfield1.setText(String.valueOf(Math.random()));
        panel1.add(txtfield1);
        return panel1;
    }

    private static void submit() {
        for (JPanel panel : panels) {
            Component[] components = panel.getComponents();
            for (Component comp : components) {
                // Cast comp to JComboBox / JTextField to get the values
                if (comp instanceof JTextField) {
                    JTextField textField = (JTextField) comp;
                    System.out.println(textField.getText());
                }
            }
        }
    }
}

关于java - 如何从 JPanel 组件(例如动态创建的下拉列表、文本字段)获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37827536/

相关文章:

java - JFrame 未正确绘制

java - 如何更改 JTextArea 中某些单词的颜色?

java - 更好地理解 J2EE 环境中的异常和日志记录

java - 事件处理 Swing 组件

java - JPanel 未显示在我的 JFrame 中,而是显示在新窗口中

java - 无法看到我绘制的所有图像并且无法让 JScrollPane 工作

java - 如何在Java中绘制点并保存输出图像?

java - XPathFactory返回xml文档

java - InputStream 中的可用方法是迭代文件的好方法吗?

java - Swing - 使用另一个框架中的 jComboBox