Попытка создать модальный диалог «Генерация отчета» в Java - PullRequest
1 голос
/ 07 декабря 2011

Итак, у меня есть приложение для составления отчетов, для создания которого требуется некоторое время, и пользователи жалуются, что нет визуального отклика о том, что отчет запущен.

Я написал небольшой класс, который должен быть модальным диалогом, который будет блокировать действия пользователя, показывать себя с фразой «Генерация отчета ...» до тех пор, пока отчет фактически не будет создан, а затемон будет скрыт, и регулярное использование вернется.

Проблема, с которой я столкнулся, заключается в том, что появляется диалоговое окно, появляется текст, но проблема в том, что переданный ему исполняемый файл не запускается.

Это диалоговое окно «занято»:

package com.company.utilities.busydialog;

import java.awt.BorderLayout;
import java.awt.Cursor;
import javax.swing.JDialog;
import javax.swing.JLabel;

public class BusyDialog extends JDialog {

    private Runnable r;

    public BusyDialog (String Message, Runnable r) {
    super();
        this.r = r;
    this.setModal(true);

    this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);

    this.setLayout(new BorderLayout());

    this.getContentPane().add(new JLabel(Message));

    this.pack();
    }

    public void show() {
    this.setVisible(true);
        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        System.out.println("running report");
    r.run();
        this.setCursor(Cursor.getDefaultCursor());
    this.setVisible(false);
    }
} 

Вот метод, который я называю его:

private void dailyUsageSubmitButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                       
    final Date date = this.dailyUsagePicker.getDate();
    final ReportController c = this.controller;
    final ProductionHRClientView view = this;
    BusyDialog dialog = new BusyDialog("Generating report...", new Runnable() {
        public void run() {
            c.generateDailyUsageReport(date, view);
        }
    });
    dialog.setResizable(false);
    dialog.setLocation(700,400);
    dialog.Show();
}    



EDIT: I tried this /3054843/kak-zastavit-modalnyi-jdialog-vypolnyat-kod-srazu-posle-pokaza

и в конечном итоге этот класс для BusyDialog:

package com.protocase.utilities.busydialog;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JLabel;

public class BusyDialog extends JDialog {

    public BusyDialog(String Message, final Runnable r) {
        super();
        this.setModal(true);
        this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        this.setLayout(new BorderLayout());
        this.getContentPane().add(new JLabel(Message));
        this.pack();
        this.addWindowListener(new WindowAdapter() {

            @Override
            public void windowOpened(WindowEvent e) {
                super.windowOpened(e);
                // do something
                doBusy(r);

            }
        });
    }

    private final void doBusy(Runnable r) {
        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        r.run();
        this.setCursor(Cursor.getDefaultCursor());
        this.dispose();
    }


}

Но это тоже не помогает.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

все JComponents в Swing должны быть выполнены на EDT, больше в Concurency в Swing

тогда вы должны:

1) this.setVisible(true); следует переместитьпоследняя строка кода в конструкторе

2) this.setVisible(true); будет заключена в invokeLater()

3) если есть долго выполняющиеся задачи, то вам нужно искать invokeAndWait()

1 голос
/ 07 декабря 2011

Попробуйте это

package com.protocase.utils.dialogs;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JLabel;

public class BusyDlg extends JDialog {

    private Runnable r;

    public BusyDlg (String Message, Runnable r) {
    super();
        this.r = r;
    this.setModal(true);

        this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);

        this.setLayout(new BorderLayout());

    this.getContentPane().add(new JLabel(Message));

        this.addWindowListener(new WindowAdapter() {

            @Override
            public void windowOpened(WindowEvent e) {
                super.windowOpened(e);
                // do something
                doBusy();
            }
        });




    this.pack();
    }

    public void Show() {
    this.setVisible(true);
    }

    public void doBusy() {
        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        r.run();
        this.setCursor(Cursor.getDefaultCursor());
    this.setVisible(false);
        this.dispose();
    }
} 
...