java - 如何使用动态消息显示忙碌/工作/加载对话框

标签 java multithreading swing jdialog

我想显示模态对话框,它会阻塞我的主窗口,我想通过方法 showLoadingDialog()、hideLoadingDialog() 和 setLoadingMessage(String message) 从外部控制它 - 我试过这段代码,但它不起作用 -加载对话框可见,但没有消息

导入 java.awt.GridLayout;
导入 java.awt.event.ActionEvent;
导入 java.awt.event.ActionListener;

导入 javax.swing.JButton;
导入 javax.swing.JDialog;
导入 javax.swing.JFrame;
导入 javax.swing.JLabel;

公共(public)类 LoadingExample {


私有(private)静态类 LoadingDialog 扩展 JDialog {

私有(private) JLabel 标签 = new JLabel("working");

公共(public) LoadingDialog(JFrame 所有者){

     super (所有者,ModalityType.APPLICATION_MODAL);

    设置未装饰(真);
    添加(标签);
    盒();

   //将窗口移动到所有者的中心
    int x = owner.getX()
        + (owner.getWidth() - getPreferredSize().width)/2;
    int y = owner.getY()
        + (owner.getHeight() - getPreferredSize().height)/2;
    设置位置(x,y);



    重绘();


}

public void setMessage(字符串消息){
    label.setText(消息);
}


}



私有(private)静态 LoadingDialog loadingDialog;


public static void main(String[] args) {


final JFrame mainWindow = new JFrame("主框架");
mainWindow.setLayout(new GridLayout(3, 3));


对于 (int i = 1; i <= 9; i++) {

    最终 int workTime = i;

    JButton workButton = new JButton("work for "+ i + "second");

   // Action 监听器,它必须在完成前显示加载对话框和倒计时秒数
    workButton.addActionListener(new ActionListener() {

    @覆盖
    public void actionPerformed(ActionEvent e) {

        显示加载对话框(主窗口);

        for (int j = 0; j < workTime; j++)
        尝试 {

           //... 在这里做一些工作

            setLoadingMessage("保持"+ (workTime - j)
                + "秒");
            loadingDialog.repaint();
            线程. sleep (1000);
        }  catch (InterruptedException e1){
            e1.printStackTrace();
        }

        hideLoadingDialog();
    }
    });


    mainWindow.add(workButton);

}

mainWindow.pack();
mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWindow.setLocationRelativeTo(null);



mainWindow.setVisible(true);

}




public static void showLoadingDialog(JFrame owner) {
如果(加载对话框!= null)
    loadingDialog.dispose();



loadingDialog = new LoadingDialog(所有者);

新线程() {
    @覆盖
    公共(public)无效运行(){
    loadingDialog.setVisible(true);
    };
}。开始();

}

public static void setLoadingMessage(字符串消息){
loadingDialog.setMessage(消息);
}


public static void hideLoadingDialog() {

如果(加载对话框!= null){
    loadingDialog.setVisible(false);
    loadingDialog.dispose();
    加载对话框=空;
}


}

}

谢谢你的建议

最佳答案

您不能从与您尝试更改的控件相关联的调度程序线程之外的其他线程对 GUI 进行更改。要正确执行此操作,您可以使用 SwingUtilities.InvokeLater:

new Thread() {
    @Override
    public void run() {

       SwingUtilities.InvokeLater(new Runnable() {
           public void run() {
              loadingDialog.setVisible(true);
           }
       });

    };
}.start();

关于java - 如何使用动态消息显示忙碌/工作/加载对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8895882/

相关文章:

java - 即使返回也显示缺少返回语句的错误

java - 禁用和启用 Java 上的按钮

java - 如何决定创建一个新的子类

c++ - 子类化 std::thread:构造函数中可变参数模板函数的问题

c - GCC Atomic Builtins 而不是 pthread?

java - 首次尝试简单的 GUI

java - 在表中插入数百万条记录

ios - MonoTouch 在后台加载图像

Java:WAITING第一帧,同时从第二帧检索数据,然后点击关闭按钮,控件也进入第一帧

java - 限制 JFormattedTextField 的小数位数(UI 外观和数据结构)