当组件在paintComponent()之外加载图像时,JFrame显示为空白; 方法

现在这可能听起来很奇怪,这也是我认为这是Java本身的一个错误的原因。

我目前正在为我的应用程序制作自定义组件。 这些组件( JComponent )覆盖paintComponent(); 方法。 出于某种原因,当我在组件中实现图像时,当使用任何这些组件时,框架显示为空白,我做了一些调试,我发现了以下内容:一旦这个覆盖方法中的代码绘制了一个存储的图像在方法本身之外的变量中,就像非静态类变量一样,框架在显示时将显示为空白,直到resize为止。 当使用存储在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();使用变量时工作正常paintComponent(); 方法本身。

通过@trashgod回答


确保仅在事件派发线程上构造和操作Swing GUI对象。

例如,使用以下代码初始化显示空白的框架,这应该可以解决您的问题;

 SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MyFrame(); } });