Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试着做一个情态动词;“生成报告”;Java中的对话框_Java_Multithreading_Swing_Jdialog_Runnable - Fatal编程技术网

试着做一个情态动词;“生成报告”;Java中的对话框

试着做一个情态动词;“生成报告”;Java中的对话框,java,multithreading,swing,jdialog,runnable,Java,Multithreading,Swing,Jdialog,Runnable,因此,我有一个报告应用程序,它需要一段时间来生成报告,用户抱怨没有关于报告正在运行的视觉反馈 我已经编写了一个小类,它是一个模式对话框,将阻止用户做任何事情,用短语“生成报告…”显示自己,直到报告实际完成,然后它将隐藏自己并返回常规使用 我遇到的问题是对话框出现了,文本出现了,但问题是传递给它的runnable没有运行 这是“忙”对话框: package com.company.utilities.busydialog; import java.awt.BorderLayout; import

因此,我有一个报告应用程序,它需要一段时间来生成报告,用户抱怨没有关于报告正在运行的视觉反馈

我已经编写了一个小类,它是一个模式对话框,将阻止用户做任何事情,用短语“生成报告…”显示自己,直到报告实际完成,然后它将隐藏自己并返回常规使用

我遇到的问题是对话框出现了,文本出现了,但问题是传递给它的runnable没有运行

这是“忙”对话框:

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 http://stackoverflow.com/questions/4542580/how-to-make-a-modal-jdialog-execute-code-immediately-upon-being-shown
最后是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();
    }


}

但是这也不行。

Swing中的所有JC组件都必须在EDT上完成,更多信息请参见

那么你必须:

1)
this.setVisible(true)应移到构造函数中的最后一行代码

2)
this.setVisible(true)将被包装在
invokeLater()中

3) 如果有长时间运行的任务,那么您必须查找
invokeAndWait()

试试这个

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();
    }
} 

我仍然需要使其成为模态,并使其运行线程。