首页 > 解决方案 > 如何消除在 Windows 上运行的 Java Swing 中的黑色滞后区

问题描述

我编写的每个 Swing 应用程序都有一个共同问题:调整窗口大小时出现黑色区域​​,即使对于下面最简单的代码也是如此:

import javax.swing.*;

public class SampleWindow extends JFrame {

    public static void main(String[] args) {
        SampleWindow sampleWindow = new SampleWindow();
        sampleWindow.setTitle("Sample Window");

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(new JLabel(
                System.getProperty("os.name") + " Java " + System.getProperty("java.version")
        ), BorderLayout.CENTER);

        sampleWindow.setContentPane(contentPane);
        sampleWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        sampleWindow.setSize(400, 200);
        sampleWindow.setVisible(true);
    }
}

在此处输入图像描述

在此处输入图像描述

让我们看看 JavaFX 的作用:

在此处输入图像描述

有没有办法消除这种情况?


我正在尝试添加一个组件侦听器并在事件发生时打印:

sampleWindow.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        System.out.println("Resizing event: " + System.currentTimeMillis());
    }
});

我得到了这些输出:

Resizing event: 1614328759426
Resizing event: 1614328759524    // huge delay
Resizing event: 1614328759525
Resizing event: 1614328759525
Resizing event: 1614328759525
Resizing event: 1614328759525
Resizing event: 1614328759525
Resizing event: 1614328759526
Resizing event: 1614328759526

很明显,第一行和第二行之间存在巨大的延迟。我认为尝试处理调整大小事件并不费力。


我发现甚至 IntelliJ 也有类似的问题,所以好吧我放弃了:(

在此处输入图像描述

标签: javaswing

解决方案


我不知道怎么做动画,但是我没有体验过这段代码的黑色区域。

示例窗口 GUI

我的收获是始终通过调用该SwingUtilities invokeLater方法来启动您的 Swing 应用程序。此方法确保在Event Dispatch Thread上创建和执行 Swing 组件。

这是我运行的代码。

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SampleWindow implements Runnable {
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SampleWindow());
    }
    
    private String properties;
    
    public SampleWindow() {
        this.properties = System.getProperty("os.name") + " Java " + 
                System.getProperty("java.version");
    }

    @Override
    public void run() {
        JFrame sampleWindow = new JFrame();
        sampleWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sampleWindow.setTitle("Sample Window");
        
        JLabel label = new JLabel(properties);
        label.setHorizontalAlignment(JLabel.CENTER);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(label, BorderLayout.CENTER);

        sampleWindow.add(contentPane, BorderLayout.CENTER);
        sampleWindow.setSize(400, 200);
        sampleWindow.setVisible(true);
    }
    
}

推荐阅读