Отображение загрузочного GIF внутри нажатия кнопки и скрытие его снова после выполнения действия - PullRequest
0 голосов
/ 16 января 2020

У меня есть следующий JFrame с достаточно простым методом выхода из приложения. Я пытаюсь добавить какой-нибудь загрузчик (желательно GIF-файл с вращением). Однако в данный момент я только что добавил JLabel, называемый loading, для отображения текста «loading ...» при нажатии кнопки.

Проблема в том, что окно сообщений (то есть действие) вообще не отображается в моей функции, и загрузочный JLabel продолжает отображаться. Может кто-нибудь объяснить, почему это не работает, и дать мне советы о том, как заменить загрузочный текст GIF. Любая помощь будет великолепна.

 public void Exit() {
    btnExit.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            // event start
            loading.setVisible(true);

            new SwingWorker<Void, String>() {
                @Override
                protected Void doInBackground() throws Exception {
                    Thread.sleep(100);
                    return null;
                }

                @Override
                protected void done() {
                    // event start
                    loading.setVisible(false);

                    // prompt user input message box //
                    int close = JOptionPane.showConfirmDialog(panel,"Are you sure?",
                            "Information", JOptionPane.YES_NO_OPTION);

                    // await user selection.
                    if(close == JOptionPane.YES_OPTION) {
                        System.exit(0);
                    }
                }
            };
        }
    });
}

1 Ответ

0 голосов
/ 16 января 2020

Создание SwingWorker само по себе недостаточно. Вы должны вызвать его метод execute () после его создания.

Планирует выполнение этого SwingWorker для выполнения в рабочем потоке. Доступно несколько рабочих потоков. Если все рабочие потоки заняты обработкой других SwingWorkers, этот SwingWorker помещается в очередь ожидания.

Примечание. SwingWorker предназначен для выполнения только один раз. Выполнение SwingWorker более одного раза не приведет к двойному вызову метода doInBackground.

В вашем случае:

SwingWorker<?,?> worker = new SwingWorker<Void, String>() {
    @Override
    protected Void doInBackground() throws Exception {
        Thread.sleep(100);
        return null;
    }

    @Override
    protected void done() {
        // event start
        loading.setVisible(false);

        // prompt user input message box //
        int close = JOptionPane.showConfirmDialog(panel,"Are you sure?",
                "Information", JOptionPane.YES_NO_OPTION);

        // await user selection.
        if(close == JOptionPane.YES_OPTION) {
            System.exit(0);
        }
    }
};
worker.execute(); //Execute the worker
...