获取模态对话框实例swing

时间:2015-09-09 11:31:13

标签: java swing joptionpane thread-sleep

我有一个应用程序,如果我点击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或其他任何方式来实现此目的?

如果我的理解是错误的,请纠正我。请原谅我是否重复。

1 个答案:

答案 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");
    }
}