让界面越发烂漫 Java SE 6.0 GUI体验
副标题#e#
Java是一种很是强大的编程语言,但Java的GUI本领一直是它的软肋。固然Java提供2种图形办理方案,AWT和Swing。但这2种图形库的成果十分有限,利用它们并不能带来更多的用户体验。并且AWT和Swing的更新速度很慢。一直到Java SE 5也没什么明明的变革。幸好Java SE 6终于为它们增加了更强大的成果。有了这些成果,利用AWT和Swing设计的用户界面可以更贴近用户。为了使读者可以或许更早地体验Java SE 6 GUI的瑰丽,本文迁就Java SE 6 GUI提供的主要成果举办接头。
显示启动界面
此刻许多贸易和非贸易软件在启动时都必需初始化,有时初始化的时间会很长,如photoshop、flash等,为了让用户有耐性继承期待,不要误觉得死器了,这些软件在初始化之前老是显示一个图形界面来汇报用户软件正在做什么。如图1是Flash8在启动时的初始化界面。
图1 Flash8的启动界面
当我们在设计软件时大概也需要这样一个界面。虽然,这在Java SE的早期版本中也可以做到,但较量费劲,根基的实现是将一个图形放到窗体上,然后先显示这个,这需要编写必然的代码,而Java SE 6提供了一个更简朴的要领,可以不添加一行代码,并且在界面要改变时还不需要从头编译源措施。让我们先看一个简朴的例子。
import javax.swing.*;
import java.awt.*;
public class TestSplash
{
public static void main(String args[])
{
try
{
// 为了让启动界面多显示3秒,
// 假如是正常的措施,这里应该时初始化代码
Thread.sleep(3000);
JFrame frame = new JFrame("Java SE 6 启动界面演示");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("我的标签", JLabel.CENTER);
frame.add(label, BorderLayout.CENTER);
frame.setSize(300, 95);
frame.setVisible(true);
}
catch (InterruptedException e)
{}
}
}
上面的措施是一个很是简朴的界面演示措施,它的界面如图2所示。
图2
假如利用java TestSplash直接运行上面的措施,将立即显示如图2的界面。Java SE 6在java呼吁上提供了一个选项,可以在显示措施主界面之前先显示一幅图。
java -splash:splash.gif TestSplash
假如运行以上的呼吁,在呈现图2所示的界面之前会先显示splash.gif,然后再过几秒钟splash.gif自动封锁,然后会显示主界面。在上面措施中的Thread.sleep(3000); 是为了使splash.gif显示的时间长一些,可以将这句改为直正的初始化代码。splash.gif文件如图3所示。
图3 splash.gif
#p#副标题#e#
在宣布时一般将措施所用到的.class文件打包成一个或几个.jar文件,假如是这样,可以将splash.gif一同打包在.jar文件中。然后在manifest.mf文件中利用SplashScreen-Image指定启动界面图象。
在打包之前,先建一个文本文件manifest.mf,内容如下:
Manifest-Version: 1.0
Main-Class: TestSplash
SplashScreen-Image: splash.gif
然后通过以下呼吁举办打包:
jar -mcvf manifest.mf Splash.jar TestSplash.class splash.gif
然后通过如下呼吁运行措施:
java -jar Splash.jar
此刻我们已经可以显示一个启动界面了,但这只是一幅静态的图,而在大大都时还需要在这幅图上显示一些信息,如正在初始化什么。在Java SE 6也提供了可以操纵这幅图的成果。下面的代码演示了如何操纵启动界面。
import javax.swing.*;
import java.awt.*;
public class TestSplash
{
public static void main(String args[])
{
try
{
String[] info = new String[]
{ "正在初始化API...", "正在初始化网络...", "正在初始化数据库..." };
SplashScreen splash = SplashScreen.getSplashScreen();
Graphics g = splash.createGraphics();
if (splash != null)
{
for (int i = 0; i < 3; i++)
{
g.setColor(Color.BLACK);
g.drawString(info[i], 350, 170 + i * 15);
splash.update();
Thread.sleep((i + 1)*1000);
}
}
JFrame frame = new JFrame("Java SE 6 启动界面演示");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("我的标签", JLabel.CENTER);
frame.add(label, BorderLayout.CENTER);
frame.setSize(300, 95);
frame.setVisible(true);
}
catch (Exception e)
{}
}
}
#p#分页标题#e#
上面的代码SplashSreen得到启动界面,然后再通过createGraphics获得一个图形句柄。本例将在启动界面显示按一按时距离断显示三个字符串,这三个字符串生存在info数组中。启动界面如图4所示。
图4 在启动界面上显示三个字符串
别的需要提一点,在SplashScreen类中有一个close要领用于封锁启动界面,但这个要领一般不需要挪用,因为在主窗口显示时这个要领自动被挪用。虽然,要想在初始化进程中封锁这启动界面,如产生初始化错误后,就不能再往下初始化了,因此,就要封锁这个界面,然后或退出措施,或直接进入主界面。
系统托盘
此刻有许多措施除了提供了一个完整的主界面外,在它最小化可能启动后在右下角的系统托盘区老是有一个小图标,如金山词霸、QQ和MSN等。图5显示了一台计较机的系统托盘里的图标。
图5 系统托盘
假如利用C++、Delphi(Pascal)等语言实现这个成果很是简朴,只要挪用一下系统API即可,但在以前版本(Java SE 5以前)的Java SE中Sun并未提供会见系统托盘的类,在当时利用Java会见系统托盘的独一要领就是利用JNI直接挪用系统API,但这种要领实现较量巨大,并且假如这样做,就粉碎了Java的跨平台特性(除非你为每一个操纵系统平台都做一个这样的类)。Java的这个缺陷和缓终于在Java SE 6中获得补充。在java.awt包中提供了一个SystemTray类可以直接会见系统托盘。下面的代码演示了一个简朴的实现。
import javax.swing.*;
import java.awt.*;
public class MyTray
{
public static void main(String args[])
{
// 判定当前操纵系统是否支持系统托盘
// 最好加上这个判定,不然这个措施大概在其它操纵系统上无法正常事情
if (SystemTray.isSupported())
{
// 通过静态要领getSystemTray()获得系统托盘
SystemTray tray = SystemTray.getSystemTray();
// 装载托盘图象
Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");
// 为这个托盘加一个弹出菜单
PopupMenu popup = new PopupMenu();
MenuItem item = new MenuItem("我的菜单");
popup.add(item);
// 为这个托盘加一个提示信息
TrayIcon trayIcon = new TrayIcon(image, "提示信息", popup);
try
{
tray.add(trayIcon);
}
catch (AWTException e)
{
System.err.println("无法向这个托盘添加新项: " + e);
}
}
else
{
System.err.println("无法利用系统托盘!");
}
}
}
在运行上面的措施之前,tray.gif必然要放到当前目次,假如放到其它的目次,要在措施中指明。图6是措施运行功效。最左侧的五彩光盘图标就是本措施插手了。
图6 运行功效
假如多次挪用tray.add(trayIcon),可以在一个措施中向系统托盘添加多个图标。但要留意,图象可以利用一个Image工具,但弹出菜单要为每一个图标建一个,假如不建,就设为null。如:
TrayIcon trayIcon1 = new TrayIcon(image, "提示信息1", null);
TrayIcon trayIcon2 = new TrayIcon(image, "提示信息2", null);
TrayIcon trayIcon3 = new TrayIcon(image, "提示信息3", null);
tray.add(trayIcon1);
tray.add(trayIcon2);
tray.add(trayIcon3);
图7为显示界面图
图7
Java SE 6还为我们提供了3种提示信息,它们是告诫、错误和信息。如利用如下语句添加提示信息。
添加告诫提示:
trayIcon.displayMessage("告诫", "这是一个告诫提示!", TrayIcon.MessageType.WARNING);
图8 告诫提示
添加错误提示:
trayIcon.displayMessage("错误", "这是一个错误提示!", TrayIcon.MessageType.ERROR);
图9 错误提示
添加信息提示:
trayIcon.displayMessage("信息", "这是一个信息提示!", TrayIcon.MessageType.INFO);
图10 信息提示
交互对话框
#p#分页标题#e#
在一般的措施语言或开拓东西中都有一些尺度的对话框以利便和用户交互,如Delphi中有InputBox对话框用来收罗用户的输入信息。在Java SE 6中也提供了雷同的尺度对话框来满意这些需求。
在Java SE 6中提供了一种输入对话框,下面是一个利用这个对话框的简朴例子。
JOptionPane pane = new JOptionPane("文本", JOptionPane.INFORMATION_MESSAGE);
pane.setWantsInput(true);
JDialog dialog = pane.createDialog(parent, "请输入文本");
dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
dialog.setVisible(true);
String msg = pane.getInputValue();
上面的代码利用JoptionPane工具的createDialog要领来成立一个输入对话框。上面的代码有几点需要留意一下。
1. 假如将pane.setWantsInput(true)改为pane.setWantsInput(false),那么输入对话框将消失。
2. 这个对话框利用的是APPLICATION_MODAL模式,Java SE 6还提供了一个DOCUMENT_MODAL模式,这两种模式最大的区别是第一种模式是对整个应用措施的,也就是说,利用这种模式弹出对话框后,整个措施都不会见,而利用第二种模式,只有弹出对话框的窗体不行会见,其它的窗体并不受影响。图11为以上代码的措施界面。
图11
图象转换
Java在图象处理惩罚上是较量强大的,可是以前的Java SE版本对付GIF图只能读,不能写。这并不是因为技能原因,而是因为GIF专利的原因。但最近这个专利到期了,因此,在Java SE 6中提供了读写GIF的成果。下面的代码演示了如何通过Java来将其它名目标图象转换为gif名目。
import javax.imageio.*;
import java.io.*;
import java.awt.image.*;
import java.util.*;
public class ToGIF
{
public static void main(String args[]) throws IOException
{
// 可以将abc.bmp换成其它名目标图象
File inputFile = new File("abc.bmp");
BufferedImage input = ImageIO.read(inputFile);
File outputFile = new File("abc.gif");
ImageIO.write(input, "GIF", outputFile);
}
}
假如你想知道在Java SE 6支持什么图象名目,可以利用如下语句举办查察。
System.out.println(Arrays.toString(ImageIO.getWriterFormatNames()));
显示功效:
[BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]