搭建Java桌面应用措施原型(二)
副标题#e#
配置系统外观
下面的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();
}
#p#副标题#e#
加载和生存图片
一个完成的产物将用文件对话框去加载一个源图片而且生存一个注释过的图片。在见识上,“文件打开”对话框将让拥护预览图片,“文件生存”对话框将答允他们去提供差异的参数,譬喻生存图片的压缩质量。Swing的尺度文件对话框是基于组件JFileChooser,这个组件可以或许通过setAccessory()要领举办自界说,让你在文件对话框上加载你的组件。
在原型安例中,留意力应该在主要成果上。因此,原型通过从呼吁行得到加载和生存路径取代用自界说的文件对话框。javax.imageio.ImageIO类简朴的read()和write()要领被用于加载和生存图片。留意,Image IO API让你知道哪种图象名目是支持的,而且你能配置譬喻压缩质量的参数。对付自界说文件对话框也将需要这些性质。
loadImage()要领读取一个图片文件,路径是由呼吁行第一个参数提供的,而且配置主要panel的配景图片:
private void loadImage() {
if (args.length >= 1)
try {
File file = new File(args[0]);
BufferedImage image = ImageIO.read(file);
mainPanel.getPaintView().getModel().setBackImage(image);
} catch (IOException x) {
log(x);
}
}
saveImage()要领得到一个主要panel的注释过的图片,而且把这个图片生存到一个文件里,路径是由呼吁行提供的第二个参数给出的:
private void saveImage() {
if (args.length >= 2)
try {
File file = new File(args[1]);
String name = file.getName();
int k = name.lastIndexOf('.') + 1;
String ext = name.substring(k);
BufferedImage image= mainPanel.getAnnotatedImage();
ImageIO.write(image, ext, file);
} catch (IOException x) {
log(x);
}
}