Java等待组件被绘制
作者:互联网
我正在尝试用Java创建一个程序,它将一个接一个地显示一组图像,调整每个图像的大小.
我正在扩展JPanel以显示如下图像:
public class ImagePanel extends JPanel{
String filename;
Image image;
boolean loaded = false;
ImagePanel(){}
ImagePanel(String filename){
loadImage(filename);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(image != null && loaded){
g.drawImage(image, 0, 0, this);
}else{
g.drawString("Image read error", 10, getHeight() - 10);
}
}
public void loadImage(String filename){
loaded = false;
ImageIcon icon = new ImageIcon(filename);
image = icon.getImage();
int w = image.getWidth(this);
int h = image.getHeight(this);
if(w != -1 && w != 0 && h != -1 && h != 0){
setPreferredSize(new Dimension(w, h));
loaded = true;
}else{
setPreferredSize(new Dimension(300, 300));
}
}
}
然后在事件线程中我正在做主要的工作:
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
createGUI();
}
});
在createGUI()中,我将浏览一组图像:
ImagePanel imgPan = new ImagePanel();
add(imgPan);
for(File file : files){
if(file.isFile()){
System.out.println(file.getAbsolutePath());
imgPan.loadImage(file.getAbsolutePath());
pack();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
问题是我的程序正确调整大小,因此图像正确加载但不显示任何内容.
如果我只显示1个图像,它也适用于最后一个图像.我认为问题是在完成图像绘制之前调用Thread.sleep().
我怎么能等待我的ImagePanel完成绘画并在那之后开始等待?
或者还有另一种解决问题的方法吗?
谢谢!
Leonty
最佳答案:
您的所有代码都在Event Dispatch Thread上执行.这有效地导致所有用户交互进入休眠状态,因为事件调度线程负责所有用户交互 – 输入(事件)和输出(绘图).
你需要等待在美国东部时间之外发生.您需要知道如何在EDT上下执行事件.你可以通过创建一个新的Runnable然后调用新的Thread(runnable)从EDT执行它或SwingUtilities.invokeLater(runnable)来使它在EDT上执行.所有与Swing组件的交互都需要在EDT上进行,因为Swing对象不是线程安全的.所有休眠,等待,文件访问,网络访问,数据库访问或任何可能阻止不确定时间段的内容都必须在美国东部时间之外进行.
Stack Overflow上有很多与Event Dispatch Thread有关的问题.我建议您查看这些内容以查找更多信息和代码示例,以便以不同方式执行您要执行的操作.
标签:java,swing,jpanel,jcomponent 来源: https://codeday.me/bug/20190515/1110047.html