几乎所有时髦的应用都有一个欢迎屏幕欢迎屏幕既是宣传产品的方法之一而且在长时间的应用启动过程中欢迎屏幕还用来表示应用正在准备过程中现在教你怎么用java中的swing技术制作一个时髦的欢迎屏幕
下面是一个最简单的欢迎屏幕实现
Java代码
class SplashWindow extends JWindow
{
public SplashWindow(String filename Frame f)
{
super(f);
JLabel l = new JLabel(new ImageIcon(filename));
getContentPane()add(l BorderLayoutCENTER);
pack();
Dimension screenSize =
ToolkitgetDefaultToolkit()getScreenSize();
Dimension labelSize = lgetPreferredSize();
setLocation(screenSizewidth/ (labelSizewidth/)
screenSizeheight/ (labelSizeheight/));
setVisible(true);
screenSize = null;
labelSize = null;
}
}
SplashWindow类从Swing的JWindow派生JWindow是一个容器它没有其他窗口所具有的各种窗口元素如标题条窗口管理按钮甚至连突出显示的边框也没有因此JWindow对于制作欢迎屏幕来说是非常合适的上面的代码假定图形文件在当前目录图形通过ImageIcon装入内存然后它就被放到了JWindow的中心接着窗口被pack()这使得Swing把窗口调整到适当的大小最后窗口被移到了屏幕的中心
如果我们运行上面的程序可以发现虽然欢迎画面确实出现在屏幕中央但遗憾的它却不会关闭!要关闭欢迎画面我们需要加入更多的代码 Java代码
class SplashWindow extends JWindow
{
public SplashWindow(String filename Frame f)
{
super(f);
JLabel l = new JLabel(new ImageIcon(filename));
getContentPane()add(l BorderLayoutCENTER);
pack();
Dimension screenSize =
ToolkitgetDefaultToolkit()getScreenSize();
Dimension labelSize = lgetPreferredSize();
setLocation(screenSizewidth/ (labelSizewidth/)
screenSizeheight/ (labelSizeheight/));
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
setVisible(false);
dispose();
}
});
setVisible(true);
}
}
和原先的SplashWindow类相比这个SplashWindow类唯一的区别在于多出了一个安装到JWindow上的匿名MouseListener经过这个改动之后用户可以点击欢迎屏幕关闭它
现在我们有了一个很不错的欢迎屏幕它可以通过点击的方法关闭但它不会自己消失接下来我们要加入代码使得欢迎屏幕在显示一定的时间之后自动消失这里我们要考虑到运用线程
Java代码
class SplashWindow extends JWindow
{
public SplashWindow(String filename Frame f int waitTime)
{
super(f);
JLabel l = new JLabel(new ImageIcon(filename));
getContentPane()add(l BorderLayoutCENTER);
pack();
Dimension screenSize =
ToolkitgetDefaultToolkit()getScreenSize();
Dimension labelSize = lgetPreferredSize();
setLocation(screenSizewidth/ (labelSizewidth/)
screenSizeheight/ (labelSizeheight/));
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
setVisible(false);
dispose();
}
});
final int pause = waitTime;
final Runnable closerRunner = new Runnable()
{
public void run()
{
setVisible(false);
dispose();
}
};
Runnable waitRunner = new Runnable()
{
public void run()
{
try
{
Threadsleep(pause);
SwingUtilitiesinvokeAndWait(closerRunner);
}
catch(Exception e)
{
eprintStackTrace();
// 能够捕获InvocationTargetException
// 能够捕获InterruptedException
}
}
};
setVisible(true);
Thread splashThread = new Thread(waitRunner SplashThread);
splashThreadstart();
}
}
这里的基本思路是利用一个在一定时间内暂停等待的Thread对象在上面的代码中线程的暂停时间是秒当这个线程唤醒时它将关闭欢迎屏幕由于Swing是非线程安全的除非代码在事件分派线程上执行否则它就不应该影响任何UI组件的状态所谓事件分派线程就是Swing中负责绘图和事件处理的线程
为了解决这个问题Swing设计者赋予我们安全地把Runnable对象加入UI事件队列的能力在本例中我们用可运行对象closerRunner完成最关键的工作我们把可运行对象传入SwingUtilitiesinvokeAndWait()静态方法然后wingUtilitiesinvokeAndWait()进行所有未完成的UI操作并执行传递给该方法的可运行对象closerRunner的run方法通过运用一个独立的线程负责欢迎屏幕的关闭操作应用担负起了显示和关闭欢迎屏幕之间的所有操作
如果要让欢迎屏幕总是显示且用户不能关闭它你必须删除那些隐藏欢迎屏幕的代码如果要让欢迎屏幕只能由用户手工关闭你可以象使用任何其他JWindow对象一样调用SplashWindow对象上的setVisible(false)和dispose()方法
总而言之借助于SwingUtilitiesinvokeAndWait()方法我们可以安全地创建出多线程欢迎屏幕具体实现时欢迎屏幕可以由用户点击关闭也可以在一定的时间之后自动关闭Swing所支持的线程模型使得应用在显示欢迎屏幕之后仍能够响应其他事件和处理其他任务