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

标签 java swing jcomponent

现在这可能听起来很奇怪,这也是我认为这是 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/

相关文章:

java - javax.swing.JFrame不包含setDefaultCLoseOperation

java - 将多个透明 JComponents 对象添加到一个 JPanel

java - 通过 Spring Boot 调用 AirTable Rest API 返回 401

java - 递归查找给定数字之前的所有素数(Project Euler 10)会出现 StackOverflow 错误

java.lang.ArrayIndexOutOfBoundsException : Having difficulty working out where error occurs

java - 可以在jtable的某些列中显示pdf作为下载链接吗?

java - JTextArea 未从另一个类更新

swing - 不能为空的抽象变量可以在KOTLIN中引发Null指针异常吗?

java - 如何在调整自定义 JSlider 大小时重新绘制

java - 为什么 OpenCV 在使用 Mat 时抛出 UnsatisfiedLinkError?