我有一个应用程序,如果我点击button1
它会显示一个模态对话框dialog1
(但我没有dialog1
的实例。),它也会启动一个线程,在线程中进行一些处理,并且在线程处理的中间,而在dialog1
线程想要显示警报可能服务器没有连接。但重点不在dialog1
之上。它正在加载为dialog1
的兄弟姐妹。有没有办法向dialog1
以下是样本。
public class Main1 extends javax.swing.JFrame {
Thread show = null;
private javax.swing.JButton jButton1;
public Main1() {
setBounds(0, 0, 500, 500);
jButton1 = new javax.swing.JButton("Button1");
jButton1.setBounds(10, 10, 100, 30);
jButton1.setVisible(true);
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
show.start();
//For Example I'm having this. I have a function call which will create and show a dialog similar to this.
java.awt.Frame frame = new java.awt.Frame();
JDialog dialog1 = new JDialog(frame, true);
dialog1.setBounds(20, 20, 300, 300);
dialog1.show();
}
});
getContentPane().add(jButton1);
getContentPane().setLayout(null);
show = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
shoe();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
});
setDefaultCloseOperation(2);
}
private void shoe() {
JOptionPane.showMessageDialog(this, "HEELO");
}
public static void main(String... f) {
new Main1().setVisible(true);
}
}
无论如何以任何方式获取Main1的子模态实例?那么我可以将该实例提供给JOptionPane.showMessageDialog(this, "HEELO");
而不是this
或其他任何方式来实现此目的?
如果我的理解是错误的,请纠正我。请原谅我是否重复。
答案 0 :(得分:0)
您的实施存在一些问题。在我看来,主要的一点是你正在修改事件派发线程之外的swing组件的状态。这不是我,您可以在Java Concurrency in Practice中读到:“Swing单线程规则:应该仅从事件派发线程创建,修改和查询Swing组件和模型。”
我的第一个提示将会更多地了解Concurrency in Swing。这似乎正是你想要做的。
我的第二个提示是尝试改进程序的模块化。通过改进应用程序的模块化,您可以实现您想要的目标。
public class Application extends JFrame {
Thread show = null;
public Application() {
setBounds(0, 0, 500, 500);
getContentPane().add(createActionButton());
getContentPane().setLayout(null);
setDefaultCloseOperation(2);
}
private createActionButton() {
button = new javax.swing.JButton("Action Button");
button.setBounds(10, 10, 100, 30);
button.setVisible(true);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
JDialog actionDialog = new ActionDialog();
new ConnectionWatchdogTask(actionDialog).execute();
actionDialog.show();
}
});
return button;
}
public static void main(String... args) {
new Application().setVisible(true);
}
}
public class ActionDialog extends JDialog {
public ActionDialog() {
super(new Frame(), true);
setBounds(20, 20, 300, 300);
}
}
public class ConnectionWatchdogTask extends SwingWorker<String, Object> {
private JDialog parentDialog;
public ConnectionWatchdogTask(JDialog dialog) {
parentDialog = dialog;
}
@Override
public String doInBackground() {
try {
Thread.sleep(3000);
return findConnectionStateOfServer();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
@Override
protected void done() {
JOptionPane.showMessageDialog(parentDialog, "Warning of some sort");
}
}