出于调试目的,我需要在一个简单的窗口中在屏幕上绘制图像。
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关闭?
答案 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();
在循环中“刷新”它。