top
Loading...
搭建Java桌面應用程序原型(二)
設置系統外觀

下面的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();
}

加載和保存圖片

一個完成的產品將用文件對話框去加載一個源圖片并且保存一個注釋過的圖片。在觀念上,“文件打開”對話框將讓擁護預覽圖片,“文件保存”對話框將允許他們去提供不同的參數,例如保存圖片的壓縮質量。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);
}
}
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗