gpt4 book ai didi

Java 启动画面无法在 Mac OSX 上运行,但可以在 PC 上运行

转载 作者:行者123 更新时间:2023-11-30 02:45:14 25 4
gpt4 key购买 nike

下面的代码是我用 Eclipse 开发的一个小型 Java 应用程序的启动屏幕的实现。启动画面在 PC 上运行良好,但在 MAC 上则不然。在 MAC OSX 上,帧首先在 2 秒内显示为灰色区域,然后在剩余的 4 秒内显示图像。图像通常应立即显示并持续 4 秒。您是否知道为什么在 Mac 上图像出现之前会出现延迟,而在 PC 上则一切正常? PS:我已将应用程序部署为可执行 Jar,并且在所有计算机上使用 Java 8。谢谢。

public static void main(String[] args)
{
SplashScreen splSplashScreen = new SplashScreen();
//Main window
FenetrePrincipale fenetrePrincipale = new FenetrePrincipale();
}
public class SplashScreen extends JWindow
{
/**
* Numéro de série
*/
private static final long serialVersionUID = 1592663893301307318L;

private final static long TEMP_AFFICHAGE = 4000;

/**
* Constructeur par initialisation
* @param p_Frame Frame
* @param p_TempsAffichage Temps d'affichage en millisecondes
*/
public SplashScreen()
{
super(new Frame());
JLabel lblImage = new JLabel(new ImageIcon(this.getClass().getResource("/res/ui/splashScreen.jpg")));

Container container = this.getContentPane();
container.add(lblImage, BorderLayout.CENTER);
pack();

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = lblImage.getPreferredSize();
this.setLocation(screenSize.width/2 - (labelSize.width/2), screenSize.height/2 - (labelSize.height/2));

this.setVisible(true);

try
{
Thread.sleep(TEMP_AFFICHAGE);
}
catch (InterruptedException ex)
{
ApplicationLogger.getInstance().severe(ex.getLocalizedMessage());
}
finally
{
this.setVisible(false);
}
}
}

最佳答案

编辑这与原始答案完全不同;我将原来的答案留在下面。

看起来最初的 JLabel 渲染在 OSX 上速度很慢 - 删除所有 sleep 仍然让我在 java 渲染标签时有大约 2 秒的暂停。所以我们改变规则。

首先,我们创建一个采用缓冲图像的 JPanel 类:

class ImgPanel extends JPanel {
private BufferedImage img;

public ImgPanel(BufferedImage img) {
this.img = img;
}

@Override
public Dimension getPreferredSize() {
return new Dimension(img.getWidth(), img.getHeight());
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null);
}
}

然后我们像这样更改启动屏幕构造函数:

public SplashScreen()
{
BufferedImage img = null;
try {
img = ImageIO.read(this.getClass().getResource("/res/ui/splashScreen.jpg"));
} catch (Exception ex) {
}

ImgPanel panel = new ImgPanel(img);
Container container = this.getContentPane();
container.add(panel);
pack();

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(screenSize.width/2 - (img.getWidth()/2), screenSize.height/2 - (img.getHeight()/2));

this.setVisible(true);
}

一旦面板出现,就会立即渲染图像,不会出现暂停。

注意 - 我已经删除了整个 sleep 代码以减少困惑 - 在单独的 SwingWorker 中可以更好地捕获逻辑,以执行启动屏幕的隐藏和主屏幕的显示:

class worker extends SwingWorker<String, Object> {
private final static long TEMP_AFFICHAGE = 4000;
private SplashScreen splash;
private FenetrePrincipale principale;

public worker(SplashScreen splash, FenetrePrincipale principale) {
this.splash = splash;
this.principale = principale;
this.splash.setVisible(true);
}

@Override
public String doInBackground() {
try
{
Thread.sleep(TEMP_AFFICHAGE);
}
catch (InterruptedException ex)
{
ApplicationLogger.getInstance().severe(ex.getLocalizedMessage());
}
return "";
}

@Override
protected void done() {
splash.setVisible(false);
principale.setVisible(true);
}
};

主要代码如下:

public static void main(String[] args)
{
SplashScreen splSplashScreen = new SplashScreen();
//Main window
FenetrePrincipale fenetrePrincipale = new FenetrePrincipale();
worker w = new worker(splSplashScreen, fenetrePrincipale);
w.execute();
}
<小时/>

原始答案 - 将 hibernate 线程放入 SwingWorker 中仍然是一个好主意,因为它允许您在初始化之前执行实际工作。

好的,这是一个使用启动代码将 sleep 从 gui 线程中移除的简单示例 - 该代码位于 this.setVisible(true) 之后,并替换了 try {} catch {}最后{}子句:

    this.setVisible(true);

worker do_work = new worker(this);
do_work.execute();
}

class worker extends SwingWorker<String, Object> {
private SplashScreen parent;

public worker(SplashScreen parent) {
this.parent = parent;
}

@Override
public String doInBackground() {
try
{
Thread.sleep(TEMP_AFFICHAGE);
}
catch (InterruptedException ex)
{
ApplicationLogger.getInstance().severe(ex.getLocalizedMessage());
}
return "";
}

@Override
protected void done() {
parent.setVisible(false);
}
};

我只是创建了一个 SwingWorker,它作为 doWorkInBackground 进行 sleep ,一旦结束,它就会关闭父框架,即启动屏幕。

关于Java 启动画面无法在 Mac OSX 上运行,但可以在 PC 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40380981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com