當前位置:首頁 » 操作系統 » eclipseswt源碼

eclipseswt源碼

發布時間: 2022-12-31 03:32:52

㈠ SWT和Swing代碼的區別

筆者過去學習過Swing(也算是AWT的增強版吧) 現在開始學習一下 SWT 還沒有開始深入 JFace 和 RCP 一步步來吧 先學好基礎的 又不用著急做項目用 本文討論的內容僅限於我已知的 SWT和Swing 范圍 希望能對有 Swing 經驗的人快速了解 SWT 有所幫助

第一個不同點就是 SWT 的類庫結構不像 Swing 沒有單一的父組件 SWT 中有好幾個父類

◆Widget —— 基本的 SWT GUI 組件(類似於 java AWT 中的 Component 和 Swing 中的 JComponent) Widget 是一個抽象類

◆Control —— 擁有操作系統的對等物的窗口小部件(換句話說 在操作系統中具有同一身份) Control 是一個抽象類

◆Composite —— 包含其他控制項的控制項(類似於 Java AWT 中的 Container 和 Swing 中的 JPanel)

◆Item —— 其他控制項包含的窗口小部件(該控制項可能不是復合控制項) 比如列表和表 注意 包含一些項的控制項很少包含其他控制項 反之亦然 Item 是一個抽象類

SWT 的組件不能隨意繼承 其源代碼中會標注 IMPORTANT This class is <em>not</em> intended to be subclassed 如果你那樣做了 運行的時候 SWT 系統就會報錯 也不能任意包含子組件 某些組件 例如 Tree 只能接收 TreeItem 作為其子組件 這樣在寫一些可重用的圖形組件的時候必須注意 Swing 中的寫法不能直接套用在 SWT 中

Swing 的所有圖形界面類都繼承自 java awt Container 這意味著所有的 Swing 組件都可以包含任意的子組件 也可以被繼承 這是兩個類庫的第一個不同點

第二個不同點就是 SWT 沒有利用 Java 的自帶垃圾收集功能來管理對象的銷毀 大部分對象都必須調用 dispose() 方可完成資源的釋放

第三個不同點就是在組件的顯示上 SWT 抽象了一個 Display 對象來處理 SWT 和操作系統底層組件的通信 資源申請釋放 事件循環 任何顯示的 SWT 組件必須有且僅有一個 Display 對象

第四個不同點就是 Swing 的組件實現了 MVC 機制 但是 SWT 沒有(目前來看)提供 MVC 機制 也就是說絕大多數 SWT 組件都是不可以更換顯示的外觀的 我的意思是例如像皮膚這樣的機制 例如 實現一個 Office 外觀的橙色菜單條的顯示 SWT 是不能通過簡單的編碼來實現的(也許有 但是還沒找到相關的資料)

SWT 的每個組件對象提供了 setData(Object) 這樣的方法來給組件存儲一個或者多個數據對象 Swing 中沒有類似的概念

第五個不同點就是絕大多數的 SWT 組件創建的時候都必須指定父組件和風格屬性 也就是必須有一個 parent 對象 也不能運行的時候動態變更父組件 具體例如 Menu 對象里有 Decorations getParent () 但是並無對應的 setParent() 方法 組件創建之後即自動加入父組件成為其一員 這和 Swing 的必須通過 add() 方法來加入父組件是不一樣的 大多數的 SWT 組件不提供無參數的構造器 這就意味這他們不是 JavaBean 這點上 Swing 的絕大多數組件都是 JavaBean

總結以上這些內容我們可以感覺到 SWT 更像是操作系統本地組件的一種封裝 而不是基於 Java OO 的概念對其進行映射 其優點就是數據結構簡單

好了 接下來還是通過一些SWT和Swing的代碼來比較吧 第一個是經典的 Hello World

SWT 版本

import eclipse swt widgets *;

public class SWTHelloWorld {

public static void main(String[] args) {Display display = new Display();Shell shell = new Shell(display);shell setText( Hello World! );shell open();while (!shell isDisposed()) {if (!display readAndDispatch())display sleep();}display dispose();}}

Swing 版本

import javax swing JFrame;

public class SwingHelloWorld {

public static void main(String[] args) {JFrame frame = new JFrame();frame setTitle( Hello World! );frame setDefaultCloseOperation(JFrame DISPOSE_ON_CLOSE);frame setSize( );frame setVisible(true);}}

SWT 的 Text 屬性在不同的組件中有不同的意思 對於窗體來說它是標題 對於控制項來說它是顯示的文本 Swing 中這個是分開的 對於窗口來說是 Title 屬性 對於控制項來說是 Text 屬性 SWT 的事件循環基於顯式的 while 模式 而 Swing 已經在底層封裝好了事件的循環和處理 所以這兩段代碼最明顯的不同就是 SWT 多了時間循環的部分 即文中粗體的部分

接著我們來看看繼承 SWT 的組件會有什麼後果 在 Swing 中繼承一個組件然後向其中添加子組件 例如建立一個自定義的工具欄 然後向其中加入子欄目 並最後顯示出來 這是經常進行的操作 再看看 SWT 中

import eclipse swt widgets Display;import eclipse swt widgets Shell;import eclipse swt widgets ToolItem;import eclipse swt SWT;

public class NewToolBar extends eclipse swt widgets ToolBar {

public static void main(String[] args) {try {Display display = Display getDefault();Shell shell = new Shell(display);new NewToolBar(shell SWT NULL);

shell open();while (!shell isDisposed()) {if (!display readAndDispatch())display sleep();}} catch (Exception e) {e printStackTrace();}}

public NewToolBar(Shell parent int style) {super(parent style);new ToolItem(this SWT NULL);}

}

lishixin/Article/program/Java/hx/201311/26347

㈡ 用eclipse怎麼作swt的窗體的開發亞

首先要在Eclipse安裝文件中找到SWT包,Eclipse組織並不提供單獨的SWT包下載,必須下載完整的Eclipse開發環境才能得到SWT包。SWT是作為Eclipse開發環境的一個插件形式存在,可以在${你的eclipse安裝路徑}\plugins路徑下的眾多子目錄下去搜索SWT.JAR文件,在找到的JAR文件中包含了SWT全部的Java類文件。因為SWT應用了JNI技術,因此同時也要找到相對應的JNI本地化庫文件,由於版本和操作平台的不同,本地化庫文件的名稱會有些差別,比如SWT-WIN32-2116.DLL是Window平台下Eclipse Build 2116的動態庫,而在Unix平台相應版本的庫文件的擴展名應該是.so,等等。注意的是,Eclipse是一個開放源代碼的項目,因此你也可以在這些目錄中找到SWT的源代碼,相信這會對開發很有幫助。下面是一段打開空窗口的代碼(只有main方法)。
import com.e2one.example;
public class OpenShell{
public static void main(String [] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
// 開始事件處理循環,直到用戶關閉窗口
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
確信在CLASSPATH中包括了SWT.JAR文件,先用Javac編譯例子程序。編譯無錯後可運行java -Djava.library.path=${你的SWT本地庫文件所在路徑} com.e2one.example.OpenShell,比如SWT-WIN32-2116.DLL件所在的路徑是C:\swtlib,運行的命令應該是java -Djava.library.path=c:\swtlib com.e2one.example.OpenShell。成功運行後,系統會打開了一個空的窗口。
剖析SWT API
下面再讓我們進一步分析SWT API的組成。所有的SWT類都用org.eclipse.swt做為包的前綴,下面為了簡化說明,我們用*號代表前綴org.eclipse.swt,比如*.widgets包,代表的是org.eclipse.swt.widgets包。
我們最常用的圖形構件基本都被包括在*.widgets包中,比如Button,Combo,Text,Label,Sash,Table等等。其中兩個最重要的構件當數Shell和Composite。Shell相當於應用程序的主窗口框架,上面的例子代碼中就是應用Shell構件打開一個空窗口。Composite相當於SWING中的Panel對象,充當著構件容器的角色,當我們想在一個窗口中加入一些構件時,最好到使用Composite作為其它構件的容器,然後再去*.layout包找出一種合適的布局方式。SWT對構件的布局也採用了SWING或AWT中Layout和Layout Data結合的方式,在*.layout包中可以找到四種Layout和與它們相對應的布局結構對象(Layout Data)。在*.custom包中,包含了對一些基本圖形構件的擴展,比如其中的CLabel,就是對標准Label構件的擴展,上面可以同時加入文字和圖片,也可以加邊框。StyledText是Text構件的擴展,它提供了豐富的文本功能,比如對某段文字的背景色、前景色或字體的設置。在*.custom包中也可找到一個新的StackLayout布局方式。
SWT對用戶操作的響應,比如滑鼠或鍵盤事件,也是採用了AWT和SWING中的Observer模式,在*.event包中可以找到事件監聽的Listener介面和相應的事件對象,例如常用的滑鼠事件監聽介面MouseListener,MouseMoveListener和MouseTrackListener,及對應的事件對象MouseEvent。
*.graphics包中可以找到針對圖片、游標、字體或繪圖的API。比如可通過Image類調用系統中不同類型的圖片文件。通過GC類實現對圖片、構件或顯示器的繪圖功能。
對不同平台,Eclipse還開發了一些富有針對性的API。例如,在Windows平台,可以通過*.ole.win32包很容易的調用ole控制項,這使Java程序內嵌IE瀏覽器或Word、Excel等程序成為可能!
更復雜的程序
下面讓我們展示一個比上面例子更加復雜一些的程序。這個程序擁有一個文本框和一個按鍵,當用戶點擊按鍵的時候,文本框顯示一句歡迎信息。
為了文本框和按鍵有比較合理的大小和布局,這里採用了GradLayout布局方式。這種布局是SWT中最常用也是最強大的布局方式,幾乎所有的格式都可能通過GradLayout去達到。下面的程序也涉及到了如何應用系統資源(Color),以及如何釋放系統資源。
private void initShell(Shell shell) {
//為Shell設置布局對象
GridLayout gShellLay = new GridLayout();
shell.setLayout(gShellLay);
//構造一個Composite構件作為文本框和按鍵的容器
Composite panel = new Composite(shell,SWT.NONE);
//為Panel指定一個布局結構對象。
這里讓Panel盡可能的占滿Shell,
也就是全部應用程序窗口的空間。
GridData gPanelData = new GridData(GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
panel.setLayoutData(gPanelData);
//為Panel也設置一個布局對象。文本框和按鍵將按這個布局對象來顯示。
GridLayout gPanelLay = new GridLayout();
panel.setLayout(gPanelLay);
//為Panel生成一個背景色
final Color bkColor = new Color(Display.getCurrent(),200,0,200);
panel.setBackground(bkColor);
//生成文本框
final Text text = new Text(panel,SWT.MULTI|SWT.WRAP);
//為文本框指定一個布局結構對象,
這里讓文本框盡可能的占滿Panel的空間。
GridData gTextData = new GridData (GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
text.setLayoutData(gTextData);
//生成按鍵
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
//為按鍵指定滑鼠事件
butt.addMouseListener(new MouseAdapter(){
public void mouseDown(MouseEvent e){
//當用戶點擊按鍵的時候,顯示信息
text.setText("Hello SWT");
}
});
//當主窗口關閉時,會觸發DisposeListener。這里用來釋放Panel的背景色。
shell.addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent e) {
bkColor.dispose();
}
});
}
把這段代碼中的方法initShell()加入到第一個打開空窗口的例子中,得到的是一段能成功運行的完整GUI應用程序。運行方法可參考第一個例子。
系統資源的管理
在一個圖形化的操作系統中開發程序,都要調用系統中的資源,如圖片、字體、顏色等。通常這些資源都是有限的,程序員務必非常小心的使用這些資源:當不再使用它們時,就請盡快釋放,不然操作系統遲早會油盡燈枯,不得不重新啟動,更嚴重的會導致系統崩潰。
SWT是用Java開發的,Java語言本身的一大優勢就是JVM的"垃圾回收機制",程序員通常不用理會變數的釋放,內存的回收等問題。那麼對SWT而言,系統資源的操作是不是也是如此?答案是一個壞消息,一個好消息。
壞消息是SWT並沒採用JVM的垃圾回收機制去處理操作系統的資源回收問題,一個關鍵的因素是因為JVM的垃圾回收機制是不可控的,也就是說程序員不能知道,也不可能做到在某一時刻讓JVM回收資源!這對系統資源的處理是致命的,試想你的程序希望在一個循環語句中去查看數萬張圖片,常規的處理方式是每次調入一張,查看,然後就立即釋放該圖片資源,而後在循環調入下一張圖片,這對操作系統而言,任何時刻程序佔用的僅僅是一張圖片的資源。但如果這個過程完全交給JVM去處理,也許會是在循環語句結束後,JVM才會去釋放圖片資源,其結果可能是你的程序還沒有運行結束,操作系統已經宕掉。
但下面的好消息也許會讓這個壞消息變得無關緊要。對於SWT,只需了解兩條簡單的"黃金"法則就可以放心的使用系統資源!之所以稱為黃金法則,一是因為少,只有兩條,二是因為它們出奇的簡單。第一條是"誰佔用,誰釋放",第二條是"父構件被銷毀,子構件也同時被銷毀"。第一條原則是一個無任何例外的原則,只要程序調用了系統資源類的構造函數,程序就應該關心在某一時刻要釋放這個系統資源。比如調用了
Font font = new Font (display, "Courier", 10, SWT.NORMAL);
那麼就應該在不在需要這個Font的時候調用
font.dispose();

㈢ Eclipse報錯 org.eclipse.swt.SWTError: No more handles

調研Jacoco,嘗試用Eclipse打開源碼——平時使用IDEA——Eclipse啟動失敗,log中提示 Caused by: org.eclipse.swt.SWTError: No more handles

You may be creating resources (such as Font, Image or GC objects) that you aren't correctly disposing. ——這個解釋看起來靠譜。

官方這個issue的comment 有建議修改注冊表:

准備按照這個提示操作。本機默認值為 2710

What is the cause of the "org.eclipse.swt.SWTError: No more handles" occurring in Process Designer

這里提到出現問題的原因可能是GDI對象過多。 https://blogs.solidworks.com/tech/2017/05/warning-solidworks-resources-running-low.html

打開任務管理器,在 詳細信息 欄的表頭右鍵進行 選擇列 ,在彈出窗口裡可以看到 GDI對象 、 用戶對象 的列名。

注意Eclipse中打開的項目的報錯信息,即使處理錯誤信息。我只是清理了錯誤日誌,重新打開Eclipse又OK了。另外,重啟大法也好使。

㈣ 如何在eclipse中查看SWT源碼

使用Eclipse開發Java程序,有時候需要查看一下某個類的源碼,這時我們可以這樣做,
滑鼠放到你要查詢的類名上,按住Ctrl鍵+滑鼠左鍵就可以了!
如果發現出現錯誤---查不到源碼,那麼此時還需要設置一下,把JDK安裝目錄下的src.zip配置一下,此文件就是Java類庫的源碼。
以JDK1.8為例,查看一下src.zip文件

如果發現找不到源代碼,則進行設置

點擊Attach Source按鈕,彈出視圖,把JDK下的src.zip文件傳入點擊OK即可

此時按住Ctrl+滑鼠左鍵指向Java類庫當中的類,就可以查看類的源代碼

㈤ 有誰知道怎麼在Eclipse中看到SWT的源代碼。我把SWT的包導到了項目下還是看不到,求救啊!!!

你的項目可能是導出之後的,沒有源代碼.唯一辦法是把.class文件反編譯成.java文件.版本較高的Eclipse本身就有反編譯功能,你就能看到了. 不知是不是這原因,試試看吧

㈥ 技術分析:使用Eclipse進行SWT編程(圖)

The best way to predict the future is to invent it —Alan Kay 為什麼要使用SWT? SWT是IBM開發一套跨平台的GUI開發框架 為什麼IBM要創建另一種GUI呢?為什麼他們不使用現有的Java GUI框架呢?要回答這些問題 我需要回到Java的早期時代 Sun已經創建了一套跨平台的GUI框架 AWT (Abstract Windowing Toolkit) 這個AWT框架使用了本地窗口組件(native widgets)不過它存在LCD問題 這個LCD問題導致了它失去主要的平台特性 換句話說 如果平台A有窗口組件 - 而平台B有窗口組件 - 那麼這個跨平台的AWT框架只能提供這兩個集合的交集 為了解決這個問題 Sun創建了一個新的框架使用模擬窗口組件(emulated widgets)來代替本地窗口組件(native widgets) 這個方法解決了LCD問題同時提供了豐富的窗口組件 不過也產生了其他的問題 例如 Swing應用程序不再和本地程序在樣子上一致 雖然JVM有了很大的改善 但是Swing應用程序仍然存在它們本地配對物所沒有的性能問題 而且 Swing應用程序消耗了太多的內存 故不適合用於PDA和行動電話等小型設備 IBM發現這些方法都無法滿足他們的需求 因此 IBM創建了新的GUI庫叫做SWT 它解決了AWT和Swing框架中的問題 SWT框架使用JNI訪問本地窗口組件(native widgets) 如果一個窗口組件在主機平台上不能獲得 那麼SWT會模擬這個不能獲取的窗口組件 一個SWT應用程序的基礎材料 Display Shell和Widgets是一個SWT應用程序的基礎材料 Displays用於管理事件循環(event loops)和控制UI線程和其他線程之間的通訊 Shell是應用程序中由操作系統窗體管理器來管理的窗體 任何SWT應用程序都需要至少一個Display實例和 個或更多的Shell實例 圖 說明了一個SWT應用程序的不同看法 第一幅圖是簡化的UI對象的繼承圖 第二幅圖是UI對象的包含結構 第三幅圖就是創建了的UI 如果一個應用程序使用多個線程 每個線程使用自己的Display對象實例 那麼你可以通過使用靜態的Display getCurent()方法得到當前活躍的Display對象實例 一個Shell表示一個特別操作系統中的一個窗口 一個Shell可以最大化 正常化 和最小化 有兩種類型的shell 一種是頂層(top level)Shell作為Display的主窗口創建的 另一種是依賴於其他shell的對話shell Shell的類型是由傳給Shell構造函數的style位決定的 Shell的默認值是對話Shell 也就是說 如果沒有傳遞任何值給構造函數參數 那麼創建的是默認的對話Shell 如果一個Display對象作為參數 那麼它是頂層(top level)Shell 有些窗口組件(widget)的屬性必須在創建時設定 這些窗口組件(widget)屬性叫做style bits Style bits是在SWT類中定義的常量 如Button button = new Button( shell ) 當然可以通過或操作|來使用多個style bit 例如 要使用一個有邊的按鈕 你需要使用SWT PUSH | SWT BORDER作為style bit參數 環境設置 開發一個SWT應用程序與開發一個Swing應用程序不同 為了可以開始一個SWT應用程序的開發 你需要把SWT庫加到classpath中 同時設置好對應的必要的環境變數 第一個需要的庫是swt jar文件 它位於ECLIPSE_HOMEeclipseplugins eclipse swt win _ wswin 目錄 根據你使用的Eclipse版本 你可能需要使用不同的目錄 這個swt jar文件必須加到你的classpath中 為此到Project >Properies >JavaBuildPath >Libraries >Add Variable > Eclipse Home >Extend並按上述路徑選擇swt jar庫 然後單擊OK 然後 你可以編譯SWT應用程序 但是由於拋出下邊所示的運行時異常 無法運行它 因為swt jar使用了本地庫 你需要設置java library path環境變數來在Java中使用本地庫 ecity cn/img_ / / / jpg > 要設置java library path變數 到Run > Run > Java Applicaton > New >Arguments > VM Arguments 然後 如何需要 如下修改path 把它粘貼到VM Arguments部分 Djava library path=c:eclipseplugins eclipse swt win _ oswin x 裝載本地庫如果你需要裝載應用程序使用的任何本地庫 你可以使用Runtime getPlatform loadLibrary( libraryname )方法 完成這些步驟 你就可以在你的eclipse環境下運行SWT程序了 你的第一個SWT應用程序 創建一個典型的SWT應用程序需要一下步驟 創建一個Display創建一個或多個Shells設置Shell的Layout manager創建Shell中的widgets開啟Shell窗口寫一個事件轉發循環銷毀display你可以使用下邊的代碼模板來快速的運行本文中的代碼片斷 你可以復制粘貼這些代碼至合適的區域 如源代碼 所示 ecity cn/img_ / / / jpg > 這個例子顯示了一個空的窗口 你可以加widget到上邊的模板 任何SWT應用程序需要 一個Display和一個或多個 Shells 這個Shell是個合成對象;它可以容納其他的合成對象 如果沒有設置shell的 layout 加到Shell的widget是不能看見的 Shell窗口必須 打開才能顯示 事件處理循環讀取並轉發GUI事件 如果沒有事件處理循環應用程序窗口是無法顯示的 即使通過open()方法來打開Shell窗口 讓後 需要在Shell被丟棄的時候銷毀 Display 導入需要的庫 你可以使用Source >Organize Imports菜單或者Ctrl+Shift+O來自動導入需要的庫 lishixin/Article/program/Java/ky/201311/28075

熱點內容
android輸入子系統 發布:2025-05-10 12:34:19 瀏覽:989
美團抵用密碼在哪裡看 發布:2025-05-10 12:31:15 瀏覽:933
sql資料庫查詢語句大全 發布:2025-05-10 12:29:41 瀏覽:418
微信點餐小程序源碼 發布:2025-05-10 12:23:57 瀏覽:477
c語言讀寫結構體 發布:2025-05-10 12:19:16 瀏覽:490
這是什麼狗上傳圖片 發布:2025-05-10 12:02:59 瀏覽:122
教小朋友編程 發布:2025-05-10 12:01:29 瀏覽:635
qq號怎麼申請賬號和密碼忘了怎麼辦啊 發布:2025-05-10 12:00:42 瀏覽:200
油冷冰箱壓縮機 發布:2025-05-10 12:00:40 瀏覽:898
四川新社保卡密碼是多少 發布:2025-05-10 11:56:06 瀏覽:764