在显示JDialog时执行SQL语句?

问题描述 投票:0回答:1

我正在将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个回答
0
投票

我想您可以在代码中添加一个propertchange侦听器。找到了类似的问题:How to prevent JOptionPane.showConfirmDialog box from closing

该帖子的答案如下:

停止自动关闭对话框

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

DialogDemo包含两个实现属性更改的对话框听众。这些对话框之一是自定义模式对话框,已实现在CustomDialog中,它同时使用JOptionPane来获取标准图标并获得布局帮助。下面的代码是另一个对话框,使用标准的是/否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!");
}
© www.soinside.com 2019 - 2024. All rights reserved.