java - 如何消除在 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 也有类似的问题,所以好吧我放弃了:(
解决方案
我不知道怎么做动画,但是我没有体验过这段代码的黑色区域。
我的收获是始终通过调用该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);
}
}
推荐阅读
- docker - 带有使用 HTTP 的 HTTPS 代理的 Docker
- gmail-api - Gmail Java API 使用 OAuth 2.0 服务帐户
- database - 实体关系图,其实体包含 2 个成对的多值属性
- matlab - 求解具有分段系数的 ODE
- matlab - MATLAB中训练和适应的区别
- android - 在 Android 中使用 MPAndroidChart BarChart 时如何更改 BarEntry 的千位分隔符?
- javascript - 如何计算多条消息的反应?
- reactjs - 为什么 keycloak 在页面刷新时未经授权?
- php - 使用 Wordpress 子主题 functions.php 在插件 css 之后添加自定义 css 文件
- ajax - Access-Control-Allow-Origin 标头设置为 * - 但无法访问 HTML img 标记中的任何位置的图像