Выполнить операторы SQL, пока JDialog видим? - PullRequest
0 голосов
/ 22 декабря 2019

Я сохраняю JTable в моей базе данных SQL. С этим проблем нет. Однако я хотел создать какое-то диалоговое окно, которое будет отображаться на экране во время загрузки данных из базы данных. Я использовал JDialog с JOptionPane:

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 во время отображения диалога, а затем закрыть себя после выполнения оператора?

1 Ответ

1 голос
/ 22 декабря 2019

Полагаю, вы можете добавить слушатель Propertchange к своему коду. Нашел похожий вопрос: [ Java Swing - Закрыть JDialog из внешней темы 1

Ответ в этом посте следующий:

Остановка автоматического диалогаЗакрытие

По умолчанию, когда пользователь нажимает кнопку, созданную JOptionPane, диалоговое окно закрывается. Но что, если вы хотите проверить ответ пользователя перед закрытием диалога? В этом случае вы должны реализовать свой собственный прослушиватель изменения свойств, чтобы при нажатии пользователем кнопки диалоговое окно не закрывалось автоматически.

DialogDemo содержит два диалоговых окна, которые реализуют прослушиватель изменения свойства. Одним из этих диалогов является пользовательский модальный диалог, реализованный в CustomDialog, который использует JOptionPane как для получения стандартного значка, так и для получения помощи по макету. В другом диалоговом окне, код которого приведен ниже, используется стандартная панель Yes / No JOptionPane. Хотя это диалоговое окно довольно бесполезно, как написано, его код достаточно прост, чтобы его можно было использовать в качестве шаблона для более сложных диалогов.

Помимо установки прослушивателя изменения свойства, следующий код также вызывает метод setDefaultCloseOperation JDialog иреализует слушатель окна, который правильно обрабатывает попытку закрытия окна. Если вы не хотите получать уведомления, когда пользователь явно закрывает окно, игнорируйте жирный код.

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!");
}
...