簡體   English   中英

將AWT應用程序轉換為SWT / JFace

[英]Converting an AWT application to SWT/JFace

我目前正在嘗試將一個小型/中型項目從AWT轉換為SWT,盡管Swing還沒有完全脫離圖片。 我正在考慮將主窗口轉換為SWT_AWT橋接對象,但我不知道這個工作的語義如何。 之后,我計划更新對話框的對話框,但不一定在一個版本中。 這可能嗎?

有人做了這樣的轉換,可以給我一些提示嗎? 那里甚至可能有教程嗎? 甚至可能有一個工具可以自動化部分內容嗎? 我試過谷歌搜索,但無濟於事。

更新:另外一件事是:目前,這是一個netbeans項目。 我不知道可能有所幫助。

我們這樣做了很多次。 但這只是因為我們從Swing應用程序轉到Eclipse RCP應用程序而不是因為我們喜歡弄亂事物。 該項目將真正讓您知道您是否已將控制器/型號代碼與視圖代碼分開。

一個建議是不要嘗試同時轉換所有內容。 你最終會得到一堆根本不起作用的混合代碼。 您可以從轉換門戶開始。 我會考慮在Tab,Dialog或Window中的任何東西,基本上是自包含單元。 如果您有一個打開的窗口,請在SWT中創建窗口,但將其內容設置為現有的AWT / Swing。 這應該是相當直接的,並允許你習慣(我真的希望他們沒有喝醉,並有充分的理由)實例化和關聯父/子控件。

可能發生的一個問題是透明組件。 除了“窗口”類之外,Swing都是用Java呈現的。 這使得以您希望的方式呈現事物變得非常容易。 在SWT中,有一些限制:

  • 邊框。 如果您使用SWT.BORDER,則會遇到本機組件使用的任何顏色。 最好的辦法是使用PaintListener並渲染自己的邊框,如果你想要它們的風格或顏色不同。
  • 透明標簽,進度條。 我無法讓標簽或進度條具有透明背景。 如果您希望它們采用父顏色或繪圖,則需要自己渲染文本和其他控件。
  • 控制。 SWT中有復合材料和控件。 將控件視為執行所有本機API調用的基本本機控件。 這些不能被子類化,這使事情變得困難。
  • 表格會給你帶來最大的麻煩。 在嘗試將JTable轉換為Table或TableViewer之前,請確保一切都穩定。 您將花費一些時間在這些上,特別是如果您有自定義編輯器和查看器。

我還沒有研究過為什么SWT的設計方式。 我猜這是一個很好的理由。 如果有人有博客或防御它的設計,那將是很好的,所以我不必搜索它。 一旦發布,我將刪除這些行,因為它們與問題無關。

加成

我想補充一點,因為你有一個現有的產品,我認為是有效的。 我能給你的最好的建議是永遠不要讓你的代碼進入一個無法編譯和運行的狀態。 如果您正在進行轉換,那么無論您在何處運行和執行(盡管SWT / AWT / Swing之間存在視覺差異),您將從長遠來看為您節省許多麻煩。 你可以做的最糟糕的事情是嘗試一次解決這個問題,讓你的代碼一次處於不穩定的狀態數周。

我建議將它導入WindowBuilder項目,因為WindowBuilder使您能夠解析現有代碼並創建GUI模型,然后將組件轉換為SWT或Swing。

如果您考慮在同一個應用程序中混合使用SWT和Swing,那么這個Eclipse Corner文章將非常有用。

我們正在准備同樣的步驟:Swing到SWT / JFace。 首先我們嘗試確定瓶頸:重新實現從帶有SWT / JFace的JComponent派生的特殊組件,搜索JIDE對接的替換(我們希望使用SWT / JFace,而不是RCP以避免太多麻煩)。 我們已經想到的最糟糕的事情是,在Swing中,您可以創建組件並稍后將其添加到父組件中。 使用SWT時,這是不可能的:必須將父組件作為對子組件構造函數的引用傳遞。 這將需要在使用SWT之前在Swing應用程序中進行重大重構。

坦率地說,我們認為轉換是一個非常重大的變化,因為我們期望沒有任何東西可以被編譯為很長的時間。 我們通過盡可能好地准備一切來減少這個時間,但我們會看到它有多好用。

2011年4月6日更新:

我們現在重構我們的Swing應用程序以始終使用其父級創建組件(如在SWT中)。 我們的子類JFrameJDialog得到了重構,只是一個JDialog實例,使其更容易切換到SWT的Shell 與此同時,我們在SWT中重寫了復雜的組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM