【问题标题】:Execute SQL Statements while JDialog visible?在 JDialog 可见时执行 SQL 语句?
【发布时间】:2019-12-22 12:35:29
【问题描述】:

我正在将一个 JTable 保存到我的 SQL 数据库中。没有问题。但是,我想制作某种对话框,在加载数据库中的数据时留在屏幕上。我使用了带有 JOptionPane 的 JDialog:

final JOptionPane pane = new JOptionPane("Loading", JOptionPane.INFORMATION_MESSAGE,
                JOptionPane.DEFAULT_OPTION, null, new Object[] {}, null);
        final JDialog dialog = new JDialog();
        dialog.setTitle("Loading");
        dialog.setModal(true);
        dialog.setContentPane(pane);
        dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);

现在,我希望在执行我的 SQL 语句后立即关闭对话框,但是似乎对话框阻止了语句的执行,因为线程显然被它阻塞了。那么,如何在对话框显示时执行我的 SQL 语句,然后在语句执行后自行关闭?

【问题讨论】:

    标签: java mysql multithreading joptionpane jdialog


    【解决方案1】:

    我猜你可以在你的代码中添加一个propertchange 监听器。 发现了一个类似的问题:[Java Swing - Close JDialog from external Thread1

    该帖子中的答案如下:

    停止自动关闭对话框

    默认情况下,当用户单击 JOptionPane 创建的按钮时, 对话框关闭。但是如果你想在之前检查用户的答案怎么办 关闭对话框?在这种情况下,您必须实现自己的属性 更改侦听器,以便当用户单击按钮时,对话框执行 不会自动关闭。

    DialogDemo 包含两个实现属性更改的对话框 听众。其中一个对话框是自定义模式对话框,已实现 在 CustomDialog 中,它使用 JOptionPane 来获取标准图标 并获得布局帮助。另一个对话框,其代码如下, 使用标准 Yes/No JOptionPane。虽然这个对话框相当 写的没用,它的代码很简单,你可以把它用作 用于更复杂对话框的模板。

    除了设置属性变化监听器,下面的代码也 调用 JDialog 的 setDefaultCloseOperation 方法并实现一个 正确处理窗口关闭尝试的窗口侦听器。如果你 当用户明确关闭窗口时不关心被通知, 然后忽略粗体代码。

    final JOptionPane optionPane = new JOptionPane(
                    "The only way to close this dialog is by\n"
                    + "pressing one of the following buttons.\n"
                    + "Do you understand?",
                    JOptionPane.QUESTION_MESSAGE,
                    JOptionPane.YES_NO_OPTION);
    
    final JDialog dialog = new JDialog(frame, 
                                 "Click a button",
                                 true);
    dialog.setContentPane(optionPane);
    dialog.setDefaultCloseOperation(
        JDialog.DO_NOTHING_ON_CLOSE);
    dialog.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent we) {
            setLabel("Thwarted user attempt to close window.");
        }
    });
    optionPane.addPropertyChangeListener(
        new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent e) {
                String prop = e.getPropertyName();
    
                if (dialog.isVisible() 
                 && (e.getSource() == optionPane)
                 && (prop.equals(JOptionPane.VALUE_PROPERTY))) {
                    //If you were going to check something
                    //before closing the window, you'd do
                    //it here.
                    dialog.setVisible(false);
                }
            }
        });
    dialog.pack();
    dialog.setVisible(true);
    
    int value = ((Integer)optionPane.getValue()).intValue();
    if (value == JOptionPane.YES_OPTION) {
        setLabel("Good.");
    } else if (value == JOptionPane.NO_OPTION) {
        setLabel("Try using the window decorations "
                 + "to close the non-auto-closing dialog. "
                 + "You can't!");
    }
    

    【讨论】:

    • 所以你的意思是我在 OptionPane 中添加了一个 propertychangelistener 并在那里执行我的 SQL 语句?
    • 是的,你也可以试试。因为你在那里获得了活动的控制权。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多