如何使JWindow立即绘制?在下面的示例中,从显示日志输出“完成”到“绘制jwindow”,在窗口显示和绘制之间有整整2秒钟的时间。第一次显示窗口时,它为空。两秒钟后,显示图像“ splash-screen.png”。
我不想在Java中使用内置的启动屏幕支持。它有问题。拜托,让我们不要陷入困境。我已经花了几天时间研究它……它不适用于我的情况(此处未完整描述)。
我已连续多次运行此代码,以查看延迟是否减少了……它保持在2秒……非常一致。我正在macOS 10.14.1和JDK 10.0.2上运行。
这是我的SSCCE:
import java.util.logging.Logger;
import javax.swing.JWindow;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.BorderLayout;
public class MyApp {
private final static Logger LOG = Logger.getLogger(MyApp.class.getName());
public static void main(String args[]) throws Exception {
final JWindow[] startupScreen = {null};
SwingUtilities.invokeAndWait(() -> {
try {
Thread.currentThread().setPriority(10);
LOG.info("edt thread priority: "+Thread.currentThread().getPriority());
startupScreen[0] = new JWindow() {
@Override
public void paint(Graphics g) {
super.paint(g);
LOG.info("painting jwindow");
}
};
/*
LOG.info("set layout");
startupScreen[0].setLayout(new BorderLayout());
*/
LOG.info("add splash image");
startupScreen[0].add(
new JLabel(new ImageIcon(
MyApp.class.getResource("splash-screen.png")
)), BorderLayout.CENTER);
LOG.info("pack");
startupScreen[0].pack();
LOG.info("set relative location");
startupScreen[0].setLocationRelativeTo(null);
LOG.info("set visible");
startupScreen[0].setVisible(true);
startupScreen[0].repaint();
startupScreen[0].revalidate();
LOG.info("done");
} catch (Exception ex) {
ex.printStackTrace();
}
});
}
}
答案 0 :(得分:0)
可能是瓶颈:
startupScreen[0].add(new JLabel(new ImageIcon(
MyApp.class.getResource("splash-screen.png"))),
BorderLayout.CENTER);
或更具体地说,在这里:
MyApp.class.getResource("splash-screen.png")
在读取未压缩的可能很大的.png图像资源时。解决方案包括不需要图像或读取较小的压缩的.jpg图像。