在這篇文章裡,我將描述一個Java桌面應用的原型,我把它叫做JImageing。我打算把焦點集中在應用的框架上,解釋我怎麼做技術上的決定和我怎麼解決在開發過程中出現的問題。
為什麼要建造一個原型?
很多應用程序的開發都是由於幾個原因從一個原型開始的。這些原因中的第一條就是,你必須確定用現有的技術能夠滿足用戶的需求。例如,在不用本地代碼的Swing應用程序中Windows集成不能夠被實現,這就導致喪失了一些Java跨平台的優勢。SWT提供了一個和操作系統有限制的集成,這就允許你在很多本地平台上運行同一應用程序。在很多場合,J2SE平台提供給你需要搭建復雜桌面應用程序的豐富性能。在搭建大型Java桌面工程之前,你總是應該搭建一個原型去看J2SE是否滿足應用程序的需求。
另一方面證明你的想法能夠被實現並且你的技術決定是正確的,一個原型能夠在開發過程中盡早的獲得用戶的反饋。原型也能幫助你估計完成你的工程所需要的時間和資源。花大量的工作去搭建一個有著菜單,對話框,拖拽特性、剪切版支持、恢復管理、打印等功能的用戶接口。在開始這些工作之前,你應該知道搭建應用程序核心功能有多困難。如果你不得不用第三方自定義組件,你應該測試他們看看是否能和你的原型一起工作。如果你不得不解決擴展和性能問題,你應該通過原型狀態找到解決方案。
用戶需求
JImageing原型是一個桌面應用程序,這個應用程序允許你給圖片注釋。Email可能是最流行的“協作工具”,但是可以通過圖片工具提高在截圖上做注釋的能力,這種圖片工具可以讓你畫線,畫矩形、橢圓並且可以寫注釋信息在圖片上。
如果JImageing的用戶使用一個以上的操作系統,那麼對於這樣的一個應用程序Java是很自然的選擇。當Windows支配桌面市場的時候,有一些用戶選擇Mac或者Linux。例如,當Java開發者通過互聯網對一個項目進行合作的時候,有一可能性是他們可以不用同一種操作系統。
這個用戶接口非常簡單,它包括一個工具欄和一個畫圖區。對於測試應用程序的主要功能來說足夠用了。下圖顯示了這個接口的樣子:
包和類
下圖顯示了原型代碼結構。應用程序的最頂層的包僅僅包含Main類,下段再詳細介紹這個類。我將要描述在將來文章中可能用到的其他類。
frames包囊括了描述應用程序主框架類,基於JDesktopPane的主要panel,和基於JInternalFrame文字注釋類。這三個類被命名為MainFrame, MainPanel和NoteFrame。
paint包組織了PaintView組件和它的數據模型(被命名為PaintModel),還有ToolBarBuilder類,這個類創建應用程序的工具欄。tools子包有繪制圖象對象的工具類。
resources包中的ResourcesSupport類是處理ToolBarResources.properties資源和來自images目錄中的圖標的工具類。
The Main Class
這個類實現了應用程序的main方法並且和所有的類、資源打包成一個JAR文件,這個JAR文件命名為JImageing.jar。用下面的命令進行打包:
jar cfm JImaging.jar m.txt com
com目錄包含包裡的類,.properties資源和.gif圖標。
m.txt文件用Main-Class: com.devsphere.articles.desktop.Main簡要說明了應用程序的主要類。
jar工具拷貝m.txt文件到在JImageing.jar中自動創建的META-INF/manifest.mf文件。
下面是Main的主要聲明描述:
package com.devsphere.articles.desktop;
import com.devsphere.articles.desktop.frames.MainFrame;
import com.devsphere.articles.desktop.frames.MainPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
main()方法調用Main()構造器,設置外觀,創建主要窗口然後顯示它:
public class Main {
private String args[];
private MainFrame mainFrame;
private MainPanel mainPanel;
private Main(String args[]) {
this.args = args;
}
public static void main(String args[]) {
Main main = new Main(args);
main.setSystemLookAndFeel();
main.createFrame();
main.showFrame();
}
...
}
命令行可以包含一個或兩個參數。用戶能指定一個圖片資源路徑作為第一個參數。應用程序加載和顯示圖片,允許用戶對它進行注釋。如果第二個參數存在,那麼應用程序保存注釋過的圖片到這個參數所給定的文件路徑。運行應用程序,下面的命令行啟動它:
java -jar JImaging.jar sourceImage annotatedImage
J2SE能夠加載GIF,JPEG和PNG文件,但是它僅僅能保存JPEG和PNG格式的圖片。你可以不用GIF格式去保存注釋過的圖片。