JAVA Swt
進(jìn)入java C/S世界
很多人以為swt與swing是同一種東西,。其實(shí)不然,。
awt/swing是sun公司發(fā)布的jdk里的,,擁有較強(qiáng)的跨平臺(tái)性,。
swt/jface是開(kāi)發(fā)eclipse用的一系列框架,后來(lái)單獨(dú)分離出來(lái),??缙脚_(tái)性相對(duì)差,這里只是說(shuō)相對(duì)于linux/unix而言,。因?yàn)樗欢ǔ绦蛏侠昧藈indows,。它是IBM在AWT和Swing上經(jīng)過(guò)優(yōu)化開(kāi)發(fā)出的新的GUI。也許你很難想像用SWT開(kāi)發(fā)出eclipse,,然后又在eclipse上開(kāi)發(fā)Swt應(yīng)用吧,。
AWT的優(yōu)勢(shì)在于,,簡(jiǎn)單,穩(wěn)定,,兼容于任何一個(gè)java版本,。也支持GUI組件的自動(dòng)disposal。同時(shí)也是線程安全的,。在AWT 中的圖形用戶界面是通過(guò)本地方法來(lái)實(shí)現(xiàn)的,,每個(gè)AWT 方法都有一個(gè)與其對(duì)應(yīng)的本地方法,稱為peer,。由于平臺(tái)無(wú)關(guān)性的需要,,AWT 所能夠?qū)崿F(xiàn)的功能是各種不同操作系統(tǒng)的圖形庫(kù)所提供的功能的交集。
而SWING,,則是為了解決AWT的很多缺點(diǎn),。SWING 提供許多比AWT更好的屏幕顯示元素。它們用純Java寫成,,所以同Java本身一樣可以跨平臺(tái)運(yùn)行,,這一點(diǎn)不像AWT。 它們是JFC的一部分,。 它們支持可更換的觀感和主題(各種操作系統(tǒng)默認(rèn)的特有主題),,然而不是真的使用原生平臺(tái)提供的設(shè)備,而是僅僅在表面上模仿它們,。這意味著你可以在任意平臺(tái)上使用JAVA支持的任意觀感,。 輕量級(jí)元件的缺點(diǎn)則是執(zhí)行速度較慢,優(yōu)點(diǎn)就是可以在所有平臺(tái)上采用統(tǒng)一的行為,。
Eclipse項(xiàng)目用稱為SWT的的圖形庫(kù)和工具包取代了Java標(biāo)準(zhǔn)中的AWT和Swing,。SWT直接調(diào)用了操作系統(tǒng)的圖形庫(kù),從而使得Java應(yīng)用程序的Look & Feel 與操作系統(tǒng)的習(xí)慣完全一致,;更為重要的是,,對(duì)本地方法的直接調(diào)用大幅度的提高了基于SWT 的Java應(yīng)用程序的運(yùn)行速度。SWT 的缺點(diǎn)主要在于兩點(diǎn):(1) 不是Java語(yǔ)言標(biāo)準(zhǔn),;和(2) 支持的平臺(tái)太少,。
AWT的含義
SWT(Standard Widget Toolkit) Standard Widget Toolkit是一個(gè)開(kāi)源的GUI編程框架,與AWT/Swing有相似的用處,,著名的開(kāi)源IDE-eclipse就是用SWT開(kāi)發(fā)的,。 在SWT之前,Sun已經(jīng)提供了一個(gè)跨平臺(tái)GUI開(kāi)發(fā)工具包AWT (Abstract Windowing Toolkit). 雖然AWT框架也使用的是原生窗口部件(native widgets),,但是它一直未能突破LCD問(wèn)題,。LCD問(wèn)題導(dǎo)致了一些主要平臺(tái)特征的遺失。
Swing的含義
Swing是一個(gè)用于開(kāi)發(fā)Java應(yīng)用程序用戶界面的開(kāi)發(fā)工具包,。它以抽象窗口工具包(AWT)為基礎(chǔ)使跨平臺(tái)應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格,。Swing開(kāi)發(fā)人員只用很少的代碼就可以利用Swing豐富,、靈活的功能和模塊化組件來(lái)創(chuàng)建優(yōu)雅的用戶界面。 工具包中所有的包都是以swing作為名稱,,例如javax.swing,javax.swing.event
公司項(xiàng)目需要做一個(gè)java swt程序監(jiān)控服務(wù)器硬件,,網(wǎng)絡(luò)等各方面狀態(tài)。用sigar實(shí)現(xiàn)的,。目前已經(jīng)差不多了,。然后還需要做一個(gè)客戶端程序安裝在運(yùn)維程序的電腦上,一旦服務(wù)器狀態(tài)出現(xiàn)異常,,可以及時(shí)處理,。沒(méi)辦法。只好用java再做一個(gè)swt程序來(lái)實(shí)現(xiàn),。其實(shí)我覺(jué)得用c#實(shí)現(xiàn)可能更容易,。呵呵。不過(guò)公司要求的是用java,,就來(lái)初識(shí)java swt吧,。至于為何選用swt原因很簡(jiǎn)單,它提供了很多的圖形化界面,。目前好像ORACLE的netBeans也有這種功能了,。
開(kāi)發(fā)SWT需要安裝Matisse這個(gè)插件,網(wǎng)上找了好久才找到,。新版的myeclipse是集成了的。不過(guò)我的是myeclipse6.5,。
Matisse4 for myeclipse下載地址:
matisse4 for myeclipse
安裝后可以看到new時(shí)多了一個(gè)選項(xiàng),。選擇一個(gè)Application或者Jframe都可以。點(diǎn)擊finish完成,。
如果點(diǎn)擊finish完成后沒(méi)有生成相應(yīng)的.form和.java文件,。很可能是沒(méi)有導(dǎo)入相關(guān)的2個(gè)jar包。swing-layout.jar和absoluteLayout.jar,。導(dǎo)入即可,。
我們可以右側(cè)導(dǎo)航圖看到相應(yīng)的GUI。
如圖:
熟悉C#的朋友,,發(fā)現(xiàn)他還真像C#,!。呵呵,。至少我這種走過(guò)來(lái)的人這么認(rèn)為,。。,。有圖形控件可以拖動(dòng),,屬性,,事件等。
點(diǎn)擊source可以查看源碼,。發(fā)現(xiàn)入口函數(shù)就是一個(gè)main方法,。運(yùn)行發(fā)現(xiàn)窗體并不是居中的。我們讓他居中需要修改入口函數(shù)如下:
- public static void main(String args[]) {
- java.awt.EventQueue.invokeLater(new Runnable() {
- public void run() {
- Main main = new Main();
- main.setVisible(true);
- main.setLocationRelativeTo(null);//null,,則此窗口將置于屏幕的中央
- main.jButton1ActionPerformed(null);
- }
- });
- }
我們可以發(fā)現(xiàn)還有另外一個(gè)main方法,,他是初始化組件的。包括初始化前,,正在初始化和初始化后,,默認(rèn)只有initCompent()初始化組件。
如果我們想要在它之前加入一個(gè)系統(tǒng)拖盤可以這么干:
- TrayIcon icon;
- public static boolean flag = true;
-
- private void init() {
-
- String root = System.getProperty("user.dir");
- System.out.println(root);
- icon = new TrayIcon(Toolkit.getDefaultToolkit().createImage(
- root + "/resource/img/1.jpg"));
- if (SystemTray.isSupported()) {// 判斷系統(tǒng)是否托盤
- // 創(chuàng)建一個(gè)托盤圖標(biāo)對(duì)象
-
- // 創(chuàng)建彈出菜單
- PopupMenu menu = new PopupMenu();
- // 添加一個(gè)用于退出的按鈕
- MenuItem item = new MenuItem("EXIT");
- MenuItem item2 = new MenuItem("STOP");
-
- item.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- try {
- System.exit(0);
- } catch (Exception ex) {
- System.exit(0);
- }
-
- }
- });
- item2.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- try {
- flag = false;
- jButton1.setEnabled(true);
- jButton2.setEnabled(false);
- setInfo("\n程序已經(jīng)正常停止");
- } catch (Exception ex) {
- System.exit(0);
- }
-
- }
- });
-
- menu.add(item);
- menu.add(item2);
- // 添加彈出菜單到托盤圖標(biāo)
- icon.setPopupMenu(menu);
- icon.setToolTip("信息收集器正在運(yùn)行中......");
- // --托盤單事件
- icon.addMouseListener(new MouseAdapter() {
- public void mouseClicked(final MouseEvent e) {
- if (e.getButton() == MouseEvent.BUTTON1) {
- setVisible(true);
- setState(Frame.NORMAL);
- }
- }
-
- });
-
- SystemTray tray = SystemTray.getSystemTray();// 獲取系統(tǒng)托盤
- try {
- tray.add(icon);
- } catch (AWTException e1) {
- e1.printStackTrace();
- }// 將托盤圖表添加到系統(tǒng)托盤
- }
-
- }
- /** Creates new form Main */
- public Main() {
- init();
- initComponents();
- initOther();
- }
-
- private void initOther() {
- String root = System.getProperty("user.dir");
- System.out.println(root);
- Toolkit tk = Toolkit.getDefaultToolkit();
- this.setIconImage(tk.createImage(root + "/resource/img/1.jpg"));
- }
如何判斷你是單擊,?中擊,?右擊?
- private void button1MouseClicked(java.awt.event.MouseEvent evt) {
- int s=evt.getButton();
- JOptionPane.showMessageDialog(null, s);
- }
- evt.getButton()=1返回表示鼠標(biāo)左鍵單擊,,2表示中擊 3表示右鍵單擊
choice中加入下拉選項(xiàng),,及判斷選擇:
- private void choice1ItemStateChanged(java.awt.event.ItemEvent evt) {
- String str=choice1.getSelectedItem();
- JOptionPane.showMessageDialog(null, str);
- }
-
- private void initData() {
- choice1.add("1");
- choice1.add("2");
- choice1.add("3");
- choice1.add("4");
- }
未完。待續(xù),。,。。吃飯睡覺(jué)了,。
|