【问题标题】:Get modal dialog instance swing获取模态对话框实例 swing
【发布时间】:2015-09-09 11:31:12
【问题描述】:

如果我点击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 或任何其他方式来实现这一点?

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

【问题讨论】:

  • 读取Oracle trails - 事件调度线程和初始线程

标签: java swing joptionpane thread-sleep


【解决方案1】:

哇,终于解决了。借助问题Get Any/All Active JFrames in Java Application?

我从列表中获得了活动窗口并将其作为父窗口提供

private void shoe() {
    Component parent = this;
    Window[] allWindows = Window.getWindows();
    for(Window window : allWindows){
        //Validate and find the appropriate window by its instance name or someother mean
        parent  = window;
     }

    JOptionPane.showMessageDialog(parent, "HEELO");
}

【讨论】:

    【解决方案2】:

    您的实施存在几个问题。在我看来,主要的一个是您正在修改事件调度线程之外的摆动组件的状态。这不是我,你可以在 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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      相关资源
      最近更新 更多