如何在同一个线程中创建JFrame以阻止它?

时间:2015-03-23 21:17:31

标签: java multithreading swing

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

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。

image description

我以前使用JDialog阻塞并停止线程,直到你按下OK:

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

这有一个缺陷 - 您无法在任务栏上看到调试窗口。有时候,很难找到窗户最终的位置。这就是我想切换到JFrame的原因。

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

2 个答案:

答案 0 :(得分:2)

  

如何在同一个线程中创建JFrame以阻止它?

使用模态JDialog。

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

这有一个缺陷 - 您无法在任务栏上看到调试窗口。

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

答案 1 :(得分:1)

之外>

 // 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();

在循环中“刷新”它。