版权声明:转载时请务必保留以下作者信息和链接
作者:陈维([email protected])作者的网站:http://www.chenwei.mobi

当应用程序启动初始,进行各种类库的初始化和装载,此时出现一个醒目的 Splash 屏幕提示着用户软件正在进行初始化工作,同时可以通过显示广告、法律许可和软件 logo 等等,给予软件用户更积极的反馈。

熟悉 Java SE 6 的朋友应该知道 Java 6 允许一个应用程序在 JVM 启动前就可以显示一个 Splash 屏幕,而我今天要说的是针对无数使用旧版本 Java 的用户——如何在使用 Java 6 之前版本开发的软件中创建一个 Splash 屏幕。

我们可以把 Splash 屏幕看作一个在程序主窗体显示前显示的画布组件,当程序初始化完毕,主窗体在屏幕上显示后Splash 屏幕自动关闭,完成它的使命。

在了解了 Splash 屏幕的行为及作用后,我选择扩展 JDialog 来完成对它的实现。

首先定制 JDialog 的外观使它符合 Splash 屏幕的外形。

在构造函数通过设置设置属性 alwaysOnTop使窗体变成顶层窗体永远出现在屏幕最上层;属性 undecorated 禁用 dialog 的装饰,这样可以去除窗体上的文本栏以及窗体最大 / 最小化 / 关闭按钮,使其完全作为一个画布存在;最后根据将在其上绘制图像的大小尺寸设置 size属性并且将 locationRelativeTo 属性设置为 null,使其显示时出现在屏幕正中。

为 Java 桌面应用程序添加 Splash 屏幕setAlwaysOnTop(true);
为 Java 桌面应用程序添加 Splash 屏幕setUndecorated(
true);
为 Java 桌面应用程序添加 Splash 屏幕setSize(
newDimension(image.getWidth(),image.getHeight()));
为 Java 桌面应用程序添加 Splash 屏幕setLocationRelativeTo(
null);

然后覆写 dialog 的 paint(Graphics g) 方法完成指定图像(广告、法律许可和 logo 等等)在画布上的绘制。

为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕publicvoidpaint(Graphicsg)...{
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
if(image!=null)...{
为 Java 桌面应用程序添加 Splash 屏幕g.drawImage(image,
0,0,this);
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}

接下来我们需要编写控制 Splash 行为的代码。

从用户体验上看,Splash 屏幕在程序主窗体打开前显示,在主窗体打开后关闭。那么它必定和主窗体的打开事件相关联,我们在 dialog 的构造函数里传入一个主窗体的引用,向其添加一个 ComponentListener, 当主窗体变为可见时销毁当前的 dialog 实例。

为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕frame.addComponentListener(newComponentAdapter()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕@Override
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicvoidcomponentShown(ComponentEvente)...{
为 Java 桌面应用程序添加 Splash 屏幕JSplashScreen.
this.dispose();
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}
);

到这里,一个 Splash 屏幕的主要代码就完成了。

通过给它添加一个鼠标监听器用来监听鼠标按下事件,使其也可以作为 About 窗体使用。当鼠标在画布上点击,窗体自动销毁。同时,我们在这个组件里定义两个静态常量用来标识它是作为 Splash 还是 About 使用。

为 Java 桌面应用程序添加 Splash 屏幕//publicstaticfinalintSPLASH_MODE=0;
为 Java 桌面应用程序添加 Splash 屏幕
//publicstaticfinalintABOUT_MODE=1;
为 Java 桌面应用程序添加 Splash 屏幕

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
if(mode==SPLASH_MODE)...{
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕frame.addComponentListener(
newComponentAdapter()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕@Override
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicvoidcomponentShown(ComponentEvente)...{
为 Java 桌面应用程序添加 Splash 屏幕JSplashScreen.
this.dispose();
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}
);
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕}
else...{
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕addMouseListener(
newMouseAdapter()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕@Override
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicvoidmouseClicked(java.awt.event.MouseEventevt)...{
为 Java 桌面应用程序添加 Splash 屏幕dispose();
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}
);
为 Java 桌面应用程序添加 Splash 屏幕}

下面是 Splash 屏幕组件JSplashScreen.java 的完整代码

为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕/**//*
为 Java 桌面应用程序添加 Splash 屏幕*JSplashScreen.java
为 Java 桌面应用程序添加 Splash 屏幕*
为 Java 桌面应用程序添加 Splash 屏幕*Createdon2007年11月20日,下午1:42
为 Java 桌面应用程序添加 Splash 屏幕
*/

为 Java 桌面应用程序添加 Splash 屏幕
packagemobi.chenwei.wing.swing;
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕
importjava.awt.Dimension;
为 Java 桌面应用程序添加 Splash 屏幕
importjava.awt.Frame;
为 Java 桌面应用程序添加 Splash 屏幕
importjava.awt.Graphics;
为 Java 桌面应用程序添加 Splash 屏幕
importjava.awt.event.ComponentAdapter;
为 Java 桌面应用程序添加 Splash 屏幕
importjava.awt.event.ComponentEvent;
为 Java 桌面应用程序添加 Splash 屏幕
importjava.awt.event.MouseAdapter;
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
/***//**
为 Java 桌面应用程序添加 Splash 屏幕*Splash Screen
为 Java 桌面应用程序添加 Splash 屏幕*根据不同的mode属性设置,也可以作为About窗体使用。
为 Java 桌面应用程序添加 Splash 屏幕*
为 Java 桌面应用程序添加 Splash 屏幕*
@authorChenWei
为 Java 桌面应用程序添加 Splash 屏幕*@websitewww.chenwei.mobi
为 Java 桌面应用程序添加 Splash 屏幕*@[email protected]
为 Java 桌面应用程序添加 Splash 屏幕
*/

为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicclassJSplashScreenextendsjavax.swing.JDialog...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕
publicstaticfinalintSPLASH_MODE=0;
为 Java 桌面应用程序添加 Splash 屏幕
publicstaticfinalintABOUT_MODE=1;
为 Java 桌面应用程序添加 Splash 屏幕
privateFrameframe=null;
为 Java 桌面应用程序添加 Splash 屏幕
privateintmode=SPLASH_MODE;
为 Java 桌面应用程序添加 Splash 屏幕
privateBufferedImageimage=null;
为 Java 桌面应用程序添加 Splash 屏幕

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicJSplashScreen(Frameframe,intmode,BufferedImageimage)...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
if(frame==null)...{
为 Java 桌面应用程序添加 Splash 屏幕
thrownewIllegalArgumentException("framemustbenonnull");
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
if(mode!=SPLASH_MODE&&mode!=ABOUT_MODE)...{
为 Java 桌面应用程序添加 Splash 屏幕
thrownewIllegalArgumentException("modemustbeoneof:SPLASH_MODEorABOUT_MODE");
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
if(image==null)...{
为 Java 桌面应用程序添加 Splash 屏幕
thrownewIllegalArgumentException("imagemustbenonnull");
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕
this.frame=frame;
为 Java 桌面应用程序添加 Splash 屏幕
this.mode=mode;
为 Java 桌面应用程序添加 Splash 屏幕
this.image=image;
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
if(mode==SPLASH_MODE)...{
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕frame.addComponentListener(
newComponentAdapter()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕@Override
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicvoidcomponentShown(ComponentEvente)...{
为 Java 桌面应用程序添加 Splash 屏幕JSplashScreen.
this.dispose();
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}
);
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕}
else...{
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕addMouseListener(
newMouseAdapter()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕@Override
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicvoidmouseClicked(java.awt.event.MouseEventevt)...{
为 Java 桌面应用程序添加 Splash 屏幕
JSplashScreen.this.dispose();
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}
);
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕initComponents();
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕setSize(
newDimension(image.getWidth(),image.getHeight()));
为 Java 桌面应用程序添加 Splash 屏幕setLocationRelativeTo(
null);
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
/***//**Thismethodiscalledfromwithintheconstructorto
为 Java 桌面应用程序添加 Splash 屏幕*initializetheform.
为 Java 桌面应用程序添加 Splash 屏幕*WARNING:DoNOTmodifythiscode.Thecontentofthismethodis
为 Java 桌面应用程序添加 Splash 屏幕*alwaysregeneratedbytheFormEditor.
为 Java 桌面应用程序添加 Splash 屏幕
*/

为 Java 桌面应用程序添加 Splash 屏幕
//<editor-folddefaultstate="collapsed"desc="GeneratedCode">
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
privatevoidinitComponents()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
为 Java 桌面应用程序添加 Splash 屏幕setAlwaysOnTop(
true);
为 Java 桌面应用程序添加 Splash 屏幕setUndecorated(
true);
为 Java 桌面应用程序添加 Splash 屏幕getContentPane().setLayout(
null);
为 Java 桌面应用程序添加 Splash 屏幕}
//</editor-fold>
为 Java 桌面应用程序添加 Splash 屏幕

为 Java 桌面应用程序添加 Splash 屏幕@Override
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicvoidpaint(Graphicsg)...{
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
if(image!=null)...{
为 Java 桌面应用程序添加 Splash 屏幕g.drawImage(image,
0,0,this);
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}

使用方法:

为 Java 桌面应用程序添加 Splash 屏幕packagemobi.chenwei.wing.swing;
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕
importjava.awt.image.BufferedImage;
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
/***//**
为 Java 桌面应用程序添加 Splash 屏幕*SplashScreen的测试类
为 Java 桌面应用程序添加 Splash 屏幕*
为 Java 桌面应用程序添加 Splash 屏幕*
@authorChenWei
为 Java 桌面应用程序添加 Splash 屏幕*@websitewww.chenwei.mobi
为 Java 桌面应用程序添加 Splash 屏幕*@[email protected]
为 Java 桌面应用程序添加 Splash 屏幕
*/

为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicclassTestSplashextendsjavax.swing.JFrame...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicTestSplash()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕
//给Splash屏幕添加一个背景图
为 Java 桌面应用程序添加 Splash 屏幕
BufferedImageimage=newBufferedImage(400,300,BufferedImage.TYPE_INT_BGR);
为 Java 桌面应用程序添加 Splash 屏幕
//初始化Splash屏幕并显示
为 Java 桌面应用程序添加 Splash 屏幕
JSplashScreensplash=newJSplashScreen(this,JSplashScreen.SPLASH_MODE,image);
为 Java 桌面应用程序添加 Splash 屏幕splash.setVisible(
true);
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕
//耗时的初始化方法
为 Java 桌面应用程序添加 Splash 屏幕
initComponents();
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
privatevoidinitComponents()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕java.awt.DimensionscreenSize
=java.awt.Toolkit.getDefaultToolkit().getScreenSize();
为 Java 桌面应用程序添加 Splash 屏幕setBounds((screenSize.width
-800)/2,(screenSize.height-600)/2,800,600);
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicstaticvoidmain(Stringargs[])...{
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕java.awt.EventQueue.invokeLater(
newRunnable()...{
为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕为 Java 桌面应用程序添加 Splash 屏幕
publicvoidrun()...{
为 Java 桌面应用程序添加 Splash 屏幕
newTestSplash().setVisible(true);
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕}
);
为 Java 桌面应用程序添加 Splash 屏幕}

为 Java 桌面应用程序添加 Splash 屏幕
为 Java 桌面应用程序添加 Splash 屏幕}

JSplashSceen 组件应用在 Panowalker_1.0 上的屏幕截图

为 Java 桌面应用程序添加 Splash 屏幕

相关文章:

  • 2022-12-23
  • 2021-09-09
  • 2021-06-19
  • 2021-06-15
  • 2021-12-21
  • 2022-12-23
  • 2021-12-16
  • 2021-10-25
猜你喜欢
  • 2022-01-30
  • 2021-12-02
  • 2022-12-23
  • 2021-12-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案