我想显示模态对话框,它会阻塞我的主窗口,我想通过方法 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/