设置系统外观
下面的setSystemLookAndFeel()方法调用了javax.swing.UIManager类的setLookAndFeel()方法:
它要求Swing从默认的Metal外观转换为本地外观:
private void setSystemLookAndFeel() {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (UnsupportedLookAndFeelException x) {
log(x);
} catch (ClassNotFoundException x) {
log(x);
} catch (IllegalAccessException x) {
log(x);
} catch (InstantiationException x) {
log(x);
}
}
通常,因为setLookAndFeel()参数都有一个可用值所以不会抛出异常。然而用标准日志API任何异常都可以作为严重错误信息被记录:
private static void log(Exception x) {
Logger.global.severe(x.getMessage());
}
原型安例中用全局日志是可以的,但是一个产品应该用它自己的日志,保存错误信息在文件中。
创建并显示主要窗口
createFrame()方法创建一个MainFrame实例,并且加载了图片:
private void createFrame() {
mainFrame = new MainFrame();
mainPanel = mainFrame.getMainPanel();
mainPanel.updateSize();
mainFrame.pack();
loadImage();
}
updateSize()设置了由getMainPanel()获得的主要面板的合理大小。pack()方法使得主框架调整大小从而让主面板和应用程序工具栏调整到合适的大小。注意到getMainPanel()和updateSize()方法是MainFrame和MainPanel类实现的应用方法。pack()方法是从java.awt.Window中继承下来的。
showFrame()方法显示应用程序的主框架并且调用主panel的requestFocus()方法。没有调用requestFocus(),焦点将被工具栏中是缩放下拉框获得,这个组件不是框架的主要组件。当应用程序开始的时候,它的主要组件应该获得焦点,即使主要panel没有处理任何键盘事件。
在窗口关闭的时候调用setDefaultCloseOperation(),禁用这个方法的默认动作而是传递DO_NOTHING_ON_CLOSE作为参数。showFrame()方法注册自己拥有的窗口监听器以便处理窗口关闭事件。当用户关闭主要框架,监听器保存一个做过注释的图片,释放框架所占用的资源并且用System.exit(0)结束应用程序的执行。
private void showFrame() {
mainFrame.setDefaultCloseOperation(
MainFrame.DO_NOTHING_ON_CLOSE);
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
saveImage();
mainFrame.dispose();
System.exit(0);
}
});
mainFrame.show();
mainPanel.requestFocus();
}