从 Swing 中的 MenuItem 打开对话框并在关闭前验证该对话框

Opening a Dialog from a MenuItem in Swing and validating that dialog before closing

我对 UI 开发 Java 和 Swing 有点陌生。我想在单击 JMenuBar 中的项目时打开一个对话框,然后在关闭它之前验证该对话框(因此,除非用户输入满足特定条件,否则按 X 或 ok 按钮将不起作用)。

目前,我的项目结构如下:

Window.java

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Window {
    private static JFrame f;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Window::createAndShowGUI);
    }

    private static void createAndShowGUI() {
        f = new JFrame("Whosebug - Testproject");
        JMenuBar menubar = new JMenuBar();
        JMenu j_menu_test = new JMenu("Test");
        JMenuItem j_menuitem_clickme = new JMenuItem("Click me");
        j_menu_test.add(j_menuitem_clickme);
        j_menuitem_clickme.addActionListener(new Open_Dialog());
        menubar.add(j_menu_test);

        f.setJMenuBar(menubar);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);

    }

    static class Open_Dialog implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            DialogPanel dialog = new DialogPanel();
            int result = JOptionPane.showConfirmDialog(null, dialog, "Test", JOptionPane.OK_CANCEL_OPTION);
            if (result == JOptionPane.OK_OPTION) {
                //do something
            }
        }
    }
}

而我的对话内容在DialogPanel.java

import javax.swing.*;

public class DialogPanel extends JPanel {
    private JTextField id_field = new JTextField(20);

    public DialogPanel() {
        add(new JLabel("Insert something to validate here:"));
        add(id_field);
    }
}

现在显然这还没有进行任何对话验证。我一直在努力让它发挥作用,我发现 a working example of dialog validation 但我似乎无法将整个 it/get 整合到 运行。 如果我拿link里的例子,我怎么调用dialog?我想我不应该使用 JOptionPane,但每次我尝试以任何其他方式显示 JDialog 时,我都会收到“无法共享 Boxlayout”错误。 请帮助我将其集成到我的代码中。

首先,您需要向 DialogPanel class 添加吸气剂。如果您希望验证在 idField 中键入的信息,您必须通过在 JtextField 上放置 ActionListener 来向此 class 添加代码。

public class DialogPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    
    private JTextField idField = new JTextField(20);

    public DialogPanel() {
        add(new JLabel("Insert something to validate here:"));
        add(idField);
    }

    public JTextField getIdField() {
        return idField;
    }
    
    public String getIdFieldString() {
        return idField.getText();
    }
}

那么,你的结果应该是这样的。

static class Open_Dialog implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        DialogPanel dialog = new DialogPanel();
        int result = JOptionPane.showConfirmDialog(null, 
                dialog, "Test", JOptionPane.OK_CANCEL_OPTION);
        if (result == JOptionPane.OK_OPTION) {
            String string = dialog.getIdFieldString();
            // Do your processing
        }
    }
}