【问题标题】:How to create JFrame in the same thread so that it blocks?如何在同一个线程中创建 JFrame 以使其阻塞?
【发布时间】:2015-03-23 21:17:31
【问题描述】:

出于调试目的,我需要在屏幕上的一个简单窗口中绘制图像。

Swing 在一个单独的消息循环线程中处理它的所有事件。这意味着如果我执行以下操作:

   while(true) {
     //Get screenshot
     BufferedImage screenshot = MSWindow.screenshot();
     //Create JFrame
     JFrame frame = new JFrame();
     Container main = frame.getContentPane();
     //This layout should force the JLabel as large as the window, am I right?
     main.setLayout(new GridLayout(1,1));
     //Create JLabel to display the screenshot
     JLabel label = new JLabel(new ImageIcon(screenshot));
     main.add(label);
     frame.pack();
     frame.setVisible(true);
     //Delay is allways good when meddling up with dangerous things
     Thread.sleep(2000);
   }

...我最终得到了很多很多 JFrame。

我曾经使用 JDialog,它会阻塞并停止线程,直到您按下 OK:

JOptionPane.showMessageDialog(null, scrollPane, message, javax.swing.JOptionPane.INFORMATION_MESSAGE);

这有一个缺陷——你在任务栏上看不到调试窗口。有时,很难找到窗口结束的位置。这就是我想切换到 JFrame 的原因。

我的问题是直截了当的:如何让当前线程等到 JFrame 关闭

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    如何在同一个线程中创建 JFrame 使其阻塞?

    使用模态 JDialog。

    JOptionPane.showMessageDialog(null, scrollPane, message, javax.swing.JOptionPane.INFORMATION_MESSAGE);
    

    这有一个缺陷——你在任务栏上看不到调试窗口。

    对话框所有者不要使用 null。确保指定所有者 JFrame。每当您单击任务栏图标时,都会显示框架和子对话框。

    【讨论】:

    • 所以我可能不得不保留一些静态 JFrame 实例,或者在模态对话框之前创建 JFrame?
    • @TomášZato,我猜你点击一个按钮或其他东西来显示你的调试窗口。您可以使用SwingUtilities.windowForCompoenent(...) 来获取显示按钮的框架。
    • 每当调用函数时,我都会生成 GUI。我用它来调试计算机视觉。
    • I generate the GUI anytime a function is called. 我猜这段代码是从你的 JFrame 应用程序中的某个地方调用的。那么也许你可以使用KeyboardFocusManager。它还有一个返回活动窗口的方法。
    【解决方案2】:

    在循环之外构建您的 GUI一次,然后使用

     // read new component data
     screenshot = MSWindow.screenshot();
     // modify components
     label = new JLabel(new ImageIcon(screenshot));     
    
     // force the frame to repaint its chilfren
     frame.revalidate();
     frame.pack();
    

    在循环内“刷新”它。

    【讨论】:

    • 问题是我的问题中的代码包含在名为showImage 的调试函数中。否则,你是对的。
    • 拆分你的逻辑。拥有一个准备 GUI 的功能和另一个更新它的功能。在您开始调试时触发第一个,并将 showImage 限制在更新部分。
    • 那不切实际。我真的像 System.out.println 一样使用它来处理图像。
    • @TomášZato:这实际上可以正常工作。如果您要保持 GUI 可见,您可以在 Swing 线程上创建图像,然后在 Swing 线程上通知 GUI,然后显示它们。
    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多