5

データベースからデータを取得し、ユーザーがその時点で既存のデータを変更できないようにする方法が必要でした。

私はSwingWorkerを作成してdbを更新し、モーダルJDialogを作成してユーザーに何が起こっているかを示しました(JProgressBarを使用)。モーダルダイアログのdefaultCloseOperationはDO_NOTHINGに設定されているため、適切な呼び出しでのみ閉じることができます-私はを使用しますsetVisible(false)

MySwingWorkerTask myTask = new MySwingWorkerTask();
myTask.execute();
myModalDialog.setVisible(true);

SwingWorkerはdoInBackground()内でいくつかのことを行い、最後に次を呼び出します。

myModalDialog.setVisible(false);

私の唯一の懸念と私の質問:SwingWorkerは、ワーカーがスポーンした後、ラインに入るsetVisible(false)前に実行する可能性がありますか?setVisible(true)

その場合、setVisible(true)は永久にブロックされる可能性があります(ユーザーはモーダルウィンドウを閉じることができません)。

次のように実装する必要がありますか?

while (!myModalDialog.isVisible()) {
    Thread.sleep(150);
}
myModalDialog.setVisible(false);

それが実際に閉じられることを確認するには?

4

1 に答える 1

3

一般的に、はい。

私がすることは、あなたのメソッドでダイアログを表示するためにdoInBackground使用し、あなたのメソッドでダイアログを非表示にすることです。SwingUtilities.invokeLaterdone

これは、ダイアログが画面に表示されない場合でも、フローをもう少し制御できることを意味します...

マイナーな問題は、ダイアログをワーカーに渡して、それを制御できるようにする必要があることです...

public class TestSwingWorkerDialog {

    public static void main(String[] args) {
        new TestSwingWorkerDialog();
    }
    private JDialog dialog;

    public TestSwingWorkerDialog() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                MyWorker worker = new MyWorker();
                worker.execute();

            }
        });
    }

    public class MyWorker extends SwingWorker<Object, Object> {

        @Override
        protected Object doInBackground() throws Exception {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    getDialog().setVisible(true);
                }
            });
            Thread.sleep(2000);

            return null;
        }

        @Override
        protected void done() {
            System.out.println("now in done...");
            JDialog dialog = getDialog();
            // Don't care, dismiss the dialog
            dialog.setVisible(false);
        }

    }

    protected JDialog getDialog() {
        if (dialog == null) {

            dialog = new JDialog();
            dialog.setModal(true);
            dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
            dialog.setLayout(new BorderLayout());
            dialog.add(new JLabel("Please wait..."));
            dialog.setSize(200, 200);
            dialog.setLocationRelativeTo(null);

        }

        return dialog;
    }

}
于 2012-10-30T00:23:12.220 に答える