【问题标题】:JFrame waits for another JFrameJFrame 等待另一个 JFrame
【发布时间】:2013-02-18 17:12:03
【问题描述】:

我有以下情况。有一个类 JFrame1 执行一系列指令并将焦点放在另一个 JFrame2 上,然后继续。当 JFrame2 获得焦点时,JFrame1 应该期望 JFrame2 处理而不是执行以下指令。怎么办?

JFrame1{
   //instruction 1
   //instruction 2
   // ....
   //instruction 6
   JFrame2 starts
   [waiting for results of JFrame2]
   //instruction 7
   //instruction 8}

JFrame1 应在恢复焦点时执行指令 7 和 8

【问题讨论】:

  • Swing 是单线程的,你不能为此使用线程。您对此的思考模型都是错误的,不同的窗口并没有真正并行执行操作,它们会调度串行处理的事件。使用事件在 GUI 组件之间进行通信。
  • 您一遍又一遍地询问same damn question。请把这个关掉。仅在 一个 问题和 一个 问题中要求澄清。这对支持本网站的志愿者不公平。

标签: java multithreading swing jframe task


【解决方案1】:

通常让一个 JFrame 启动另一个 JFrame 是不好的,除非它们是完全独立的。我建议您启动 JDialog 而不是 JFrame2。 JDialog 的使用方式与 JFrame 相同,所有命令都相同。启动 JDialog 的 JFrame 将暂停,直到从 JDialog 类中调用 this.dispose() 来处理 JDialog。然后它看起来像这样:

JFrame1 starts
instruction 1
instruction 2
...
instruction 6
JDialog (like JFrame2) starts
(JFrame1 waiting for JDialog to be disposed with this.dispose())
instruction 7
...

【讨论】:

    【解决方案2】:
    【解决方案3】:

    我假设您的意思是当前,指令 7 和 8 在第 2 帧打开后立即发生。要在 JFrame2 关闭后执行指令 7 和 8,您可以使用 JDialog 或 JOptionPane 使 JFrame2 成为模态对话框,或者您可以将侦听器附加到 JFrame2,如下所示:

    frame2.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            // instruction 7
            // instruction 8
        }
    });
    

    【讨论】:

      【解决方案4】:

      您应该尝试将您正在做的事情组织到一个类中并创建对象。显然这是一个极其简化的例子:

      public class Frames extends JFrame{
        public Frames(){
         super("Frame 1");
         setSize(500,500);
         //setup frame 1 look
         doWorkMethodForFrame1();
        }
        public Frames(int arg){
         super("Frame 2");
         setSize(500,500);
         //setup frame 2 look
          doWorkMethodForFrame2(data);
        }
      
      
         public void doWorkMethodForFrame1(){
         //do work
         setVisible(false);
         }  
         public void doWorkMethodForFrame2(int data){
         //do work
         setVisible(false);
         }
      
      
      
      
      }
      
      //call your frames
      new Frames();
      new Frames(dataSend);
      

      【讨论】:

        猜你喜欢
        • 2013-06-21
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        相关资源
        最近更新 更多