现在这可能听起来很奇怪,这也是我认为这是 Java 本身的错误的原因。
我目前正在为我的应用程序制作自定义组件。这些组件(范围为 JComponent
)会覆盖 paintComponent();
方法。由于某种原因,当我在组件中实现图像后,使用这些组件中的任何一个时,框架会显示为空白,我做了一些调试,发现了以下内容:
一旦此覆盖方法内的代码绘制了存储在方法本身外部的变量(如非静态类变量)中的图像,框架在显示时将显示为空白,直到调整其大小。使用 paintComponent();
方法本身的变量中存储的图像时,一切正常。这里发生了什么,我该如何解决这个问题?我确实需要使用存储在类变量中的图像来缓存这些图像,否则一次又一次加载每个图像将非常耗费性能。
类似于以下示例的代码可以正常工作;
public class MyComponent extends JComponent {
@Override
public void paintComponenet(Graphics g) {
Image img = ImageIO.read(getClass().getResource("/res/myImg.png"));
g.drawImage(img, 0, 0, null);
}
}
当使用类似的东西时,框架会显示为空白;
public class MyComponent extends JComponent {
private Image img = ImageIO.read(getClass().getResource("/res/myImg.png"));
@Override
public void paintComponenet(Graphics g) {
g.drawImage(img, 0, 0, null);
}
}
在构造函数或任何其他方法中加载图像(在上面的示例中)不会产生任何效果。
注意:在显示组件之前(或之后),使用组件的框架不会被打包。但这应该没有任何意义,因为在 paintComponent();
方法本身内部使用变量时它工作得很好。
最佳答案
回答者@trashgod
<小时/>确保 Swing GUI 对象仅在 event dispatch thread 上构造和操作。 .
例如,使用以下代码初始化显示空白的框架,这应该可以解决您的问题;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MyFrame();
}
});
关于java - 当组件在paintComponent()外部加载图像时,JFrame显示为空白;方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037617/