【发布时间】:2017-03-15 19:50:11
【问题描述】:
下面的代码是我用 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);
}
}
}
【问题讨论】:
-
Thread.sleep()导致 java 应用程序停止处理消息;这意味着 UI 不会更新。遵循this answer 中的前提,这将有助于您适当地创建工人。 -
但是图像出现在 Thread.sleep() 结束之前。而且,Thread.sleep() 不应停止图像的加载,因为图像是在 Thread.sleep() 之前加载的 (this.setVisible(true);)。
-
它会停止重绘,这是导致问题的原因。当你阻塞 UI 线程时,这些事情就会发生。解决办法是不阻塞UI线程
-
好的,那我应该把 Thread.sleep() 放在更合适的地方吗?如果没有,我怎么能让图片在 4 秒后消失?我不想实现 SplashScreen API。我正在寻找一个非常简单的解决方案。我只想在应用程序启动前的 4 秒内显示一张图片。谢谢
标签: java eclipse macos splash-screen executable-jar