我正在将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语句,然后在执行语句后关闭自身?
我想您可以在代码中添加一个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!");
}