【问题标题】:Opening a Dialog from a MenuItem in Swing and validating that dialog before closing在 Swing 中从 MenuItem 打开一个对话框并在关闭之前验证该对话框
【发布时间】:2020-11-09 08:51:00
【问题描述】:

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

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

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("Stackoverflow - 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,但我似乎无法整合它/让整个事情运行起来。 如果我从链接中获取示例,我该如何调用对话框?我认为我不应该使用 JOptionPane 但每次我尝试以任何其他方式显示 JDialog 时都会收到“无法共享 Boxlayout”错误。 请帮我把它集成到我的代码中。

【问题讨论】:

标签: java swing jdialog


【解决方案1】:

首先,您需要将 getter 添加到您的 DialogPanel 类。如果您想验证在idField 中输入的信息,您必须通过在JtextField 上添加ActionListener 来向此类添加代码。

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
        }
    }
}

【讨论】:

  • 感谢您的回复,但如果我理解正确,在使用 JOptionPane 类时单击“确定”或“取消”按钮将始终导致对话框关闭。通过你的实现,我之后得到了字符串,我可以对其进行一些检查,但是对话框仍然会关闭,不是吗?
  • @krise:您必须向 DialogPanel 类添加一个 ActionListener 和其他代码,以验证 JTextField 的内容。如果您创建自己的 JDialog,您将可以更好地控制按钮操作。
猜你喜欢
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多