使用JacpFX和JavaFX2構建富客戶端

創建快速且可擴展的桌面客戶端始終是一個挑戰,特別是在處理大量數據和長時間運行的任務時。 盡管Eclipse RCP和Netbeans RCP是已建立的平臺,但其想法是建立一個輕量級的框架來異步處理組件,類似于Web組件。 開發人員在線程主題上的工作應較少,并且應該能夠自己對應用程序的消息流進行建模。 這些以及許多其他想法產生了JacpFX項目。

JacpFX

JacpFX(Java異步客戶端平臺)項目是一個框架,可使用JavaFX 2Spring和類似于Actor的組件方法以MVC樣式創建Rich Client (桌面和/或Web)。 它提供了一個簡單的API,用于創建工作區,透視圖和組件。 與所有部分進行通信并輕松組成您的客戶應用程序。

JacpFX為您提供什么?

  • 使用Java中的小型和簡單API (?120Kb)實現擴展和響應式Rich Clients
    • 與Spring和JavaFX 2完全集成
  • 在運行時在用戶界面中添加/移動/刪除定義的組件
    • 在Perspectives中創建基本布局,并為組件UI定義“占位符”
  • 在FX應用程序線程之外處理組件
    • “ handle”方法在工作線程中執行,“ posthandle”方法由FX應用程序線程執行
  • 有狀態和無狀態回調非UI組件
    • 外包長期運行的流程和計算
  • 輕松處理異步過程
    • 不需要顯式線程或類似Runtime.invoke()的東西
  • 通過異步消息進行通信
  • 組件之間沒有共享數據
  • 不變的訊息

以下文章將為您簡要介紹JacpFX以及如何使用它創建基于JavaFX 2的Rich Clients。 這里顯示的示例客戶端是一個(偽)聯系人管理器,您可以在這里嘗試: http : //developer.ahcp.de/demo/JACPFX2Demo.html ; 您可以在此處下載完整的源代碼: http : //code.google.com/p/jacp/downloads/list

前提條件:

必須安裝有效的JavaFX2運行時才能運行演示應用程序(當前僅在Windows上可用)。 為了編譯隨附的演示代碼,假定已安裝JavaFX2 SDK(也適用于Mac和Linux)和Apache Maven。 請參閱本文末尾的詳細說明:

圖1:第一次選擇類別,客戶會要求您生成250.000個聯系人。 生成這些聯系人并將其增量添加到表格視圖后,您可以選擇下一個類別,瀏覽到下一個表格頁面,查看消費者圖表數據或僅編輯聯系人。 請記住,演示客戶端代碼中未使用任何顯式線程

應用–結構

JacpFX應用程序由應用程序啟動器,工作臺,至少一個透視圖和至少一個組件組成。 示例客戶端使用三個UI組件和三個非UI(回調)組件來創建數據并模擬大量數據訪問。

應用程序–啟動器(AFX2SpringLauncher)

應用程序-啟動器是定義Spring上下文的應用程序的主類。 JacpFX –應用程序使用xml聲明來定義應用程序和所有元數據的層次結構,例如“ component-id”和“ execution-target”。 Spring main.xml位于資源目??錄中,并將在啟動程序構造函數中聲明:

public class ContactMain extends AFX2SpringLauncher {public ContactMain() {super("main.xml");}public static void main(String[] args) {Application.launch(args);}@Overridepublic void postInit(Stage stage) {// define your css and other config stuff here}
}

清單1:應用程序啟動器

應用程序–工作臺(AFX2Workbench)

工作臺是JacpFX應用程序的UI根節點。 在這里,您可以配置應用程序,設置分辨率,定義工具–條,菜單,并參考JavaFX階段。

public class ContactWorkbench extends AFX2Workbench {@Overridepublic void handleInitialLayout(IAction<Event, Object> action,IWorkbenchLayout<Node> layout, Stage stage) {layout.setWorkbenchXYSize(1024, 768);layout.registerToolBar(ToolbarPosition.NORTH);layout.setMenuEnabled(true);}@Overridepublic void postHandle(FX2ComponentLayout layout) {final MenuBar menu = layout.getMenu();final Menu menuFile = new Menu("File");final MenuItem itemHelp = new MenuItem("Help");/// add the event listener and show an option-pane with some help textmenuFile.getItems().add(itemHelp);menu.getMenus().addAll(menuFile);    }
}

清單2:工作臺

透視圖(AFX2Perspective)

透視圖的任務是提供當前視圖的布局,并注冊視圖的根節點和所有葉節點。 葉節點是與此透視圖關聯(注入)的所有組件的“執行目標”(容器)。 演示透視圖基本上定義了兩個SplitPanes ,并將它們注冊為“執行目標”,以在左側顯示ContactTreeView的內容。 右上方的ContactTableView和右下方的ContactChartView

圖2:演示中的透視圖定義的三個目標
public class ContactPerspective extends AFX2Perspective {@Overridepublic void onStartPerspective(FX2ComponentLayout layout) {// create button in toolbar; button should switch top and bottom id's ToolBar north = layout.getRegisteredToolBar(ToolbarPosition.NORTH);
...north.getItems().add(new Button("switch view");) ;}@Overridepublic void onTearDownPerspective(FX2ComponentLayout layout) {   }@Overridepublic void handlePerspective(IAction<Event, Object> action,FX2PerspectiveLayout perspectiveLayout) {if (action.getLastMessage().equals(MessageUtil.INIT)) {createPerspectiveLayout(perspectiveLayout);}     
}private void createPerspectiveLayout(FX2PerspectiveLayout perspectiveLayout) {define your UI layout...// Register root componentperspectiveLayout.registerRootComponent(mainLayout);// register left menuperspectiveLayout.registerTargetLayoutComponent("PleftMenu", leftMenu);// register main content TopperspectiveLayout.registerTargetLayoutComponent(“PmainContentTop”,mainContentTop);// register main content BottomperspectiveLayout.registerTargetLayoutComponent("PmainContentBottom",mainContentBottom);}}

清單3:透視圖

UI組件(AFX2Component)

AFX2Components是JacpFX應用程序中實際的UI組件,它們呈現為JavaFX組件。 該演示定義了左側( ContactTreeView ),主頂部( ContactTableView )和主底部( ContactDemoChartViewAFX2Component 。 JacpFX組件有四種實現方法: “ onStartComponent”和“ onTearDownComponent”以及“ handleAction”和“ postHandleAction”。 在工作線程中執行“ handleAction”時,在FX應用程序線程中運行“ postHandle”。

圖3:AFX2Component的組件生命周期

您可以根據需要使用組件的延遲初始化以及關閉或重新啟動組件。

public class ContactTreeView extends AFX2Component {private ObservableList<Contact> contactList;...@Overridepublic Node handleAction(final IAction<Event, Object> action) {if (action.getLastMessage().equals(MessageUtil.INIT)) {this.pane = new ScrollPane();        ...return this.pane;}return null;}@Overridepublic Node postHandleAction(final Node node,final IAction<Event, Object> action) {if (action.getLastMessage() instanceof Contact) {this.contactList.addAll((Contact) action.getLastMessage());}return this.pane;}@Overridepublic void onStartComponent(final FX2ComponentLayout layout) {final ToolBar north = layout.getRegisteredToolBar(ToolbarPosition.NORTH);…north.add(new Button("add category"));}@Overridepublic void onTearDownComponent(final FX2ComponentLayout layout) {    }...    
}

清單4:ContactTreeView(左視圖)

清單4中的“ handleAction”方法用于初始化組件UI。 在演示的“ postHandle”操作中,添加了新聯系人; contactList已綁定到現有的TreeView,因此您無法在FX應用程序線程之外對其進行更新,因此必須使用“ postHandle”方法。

回調組件

JacpFX回調組件是非UI /服務組件。 與AFX2Component相似,它們具有一種稱為“處理”的方法,該方法在工作線程中執行。 結果可以是任何類型的對象,并將自動傳遞回調用組件或重定向到任何其他組件。

在這些類型的組件中,您將執行長時間運行的任務,調用服務調用或僅從存儲中檢索數據。 JacpFX提供兩種類型的回調組件,“ AStatelessCallbackComponent ”和(有狀態的)“ ACallbackComponent ”。 演示客戶端使用“ ACallbackComponent ”組件為選定的聯系人表生成隨機圖表數據。

為了生成大量聯系人,需要使用兩個“ AStatelessCallbackComponents ”。 其中一個組件將總金額分成大塊,第二個組件僅創建聯系人。 結果將直接發送到UI組件并添加到表中。

訊息傳遞

消息傳遞是JacpFX框架的本質。 JacpFX使用異步消息傳遞來通知應用程序的組件和觀點。

在演示應用程序中為類別創建初始數據量的消息流如下所示:

圖4:在演示應用程序中創建初始數據量的消息流

JacpFX組件的狀態始終由消息更改。 如果應該在后臺線程中處理任務,則只需向組件發送一條消息,然后使用“ handle”方法處理工作。 結果可以發送回調用方組件,或由FX應用程序線程在“ postHandle”方法中進行處理(對于UI組件)。 您應始終避免在FX應用程序線程上執行長時間運行的任務; 而是在“ handle”方法中調用您的服務或數據庫操作。

JacpFX在兩種消息類型( 本地消息和全局消息)之間有所不同。

本地留言

要觸發本地消息,只需獲取一個偵聽器

IActionListener<EventHandler<Event>, Event, Object> listener =   this.getActionListener(“message”);

僅帶有一個參數–消息本身。 可以將此偵聽器分配給任何JavaFX eventHandler(例如onMouseEvent等),也可以通過調用將其觸發

listener.performAction(event);

全局消息

通過全局消息,您可以與其他已注冊組件通信。 默認情況下,回調組件會響應消息,因此您無需顯式創建響應消息-也可以。 消息傳遞是在組件之間交換數據和觸發任務的首選方式。 與本地消息類似,您可以創建一個偵聽器實例,但具有明確的目標ID:

IActionListener<EventHandler<Event>, Event, Object> listener =   this.getActionListener(“id“,“message”);

從源代碼構建演示應用程序

在本地Maven存儲庫中注冊JavaFX

所有JacpFX-Projects都是Maven項目,并且需要JavaFX 2(jfxrt.jar)。 其中一些包含JavaFX 2作為系統依賴項,但是我們更愿意在本地存儲庫中注冊jfxrt.jar。 要創建可部署文件(jnlp和html),您還需要注冊JavaFX Ant-Tasks(ant-javafx.jar)。 為此,請更改您的$ {SDK-home} / rt / lib并輸入:

mvn install:install-file -Dfile=jfxrt.jar -DgroupId=com.oracle -DartifactId=javafx-runtime -Dpackaging=jar -Dversion=2.0

然后將“ bin”目錄(在Linux i386上)復制到您的.m2 \ repository \ com \ oracle \ javafx-runtime文件夾中。 接下來轉到$ {SDK-home} / tools目錄,然后鍵入:

mvn install:install-file -Dfile=ant-javafx.jar -DgroupId=com.oracle -DartifactId=ant-javafx -Dpackaging=jar -Dversion=2.0

建立項目

要構建項目,只需解壓縮項目文件夾并鍵入mvn package 。 jar,jnlp和html文件在$ {projectHome} / target / deploy中創建 。 要創建Eclipse項目,只需鍵入mvn eclipse:eclipse

接下來會發生什么?

JacpFX當前是1.0版; 在使用Echo3和Swing進行了多年的原型設計之后,JacpFX是基于JavaFX 2和已定義的發布計劃的第一個穩定版本。 您可以在項目Wiki頁面( http://code.google.com/p/jacp/wiki/Documentation )上找到詳細的文檔。 我們的發布計劃(也位于Wiki上)在今年6月定義了1.1版。 主要的變化將是注釋支持和官方的FXML支持(您也已經可以使用FXML)。 隨時歡迎您提供反饋,請隨時與我們聯系。

參考: W4G合作伙伴 Andy Moncsek的 JacpFX和JavaFX2構建富客戶端


翻譯自: https://www.javacodegeeks.com/2012/03/building-rich-clients-with-jacpfx-and.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373631.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

lob移表空間 oracle_Oracle數據庫(1)Oracle體系結構概述(一)

Oracle數據庫的體系結構主要包括&#xff1a;物理存儲結構、邏輯存儲結構、內存結構和實例進程結構。了解了Oracle的體系結構&#xff0c;就可以對Oracle數據庫有一個整體認識&#xff0c;這樣有利于后續Oracle的學習。下面我們分別來了解邏輯存儲結構、物理存儲結構、內存結構…

Linux入門筆記——文件操作命令2

cp Copy files and directories&#xff08;復制文件和目錄&#xff09; cp 選項&#xff1a; 選項 意義 -a, --archive 復制文件和目錄&#xff0c;以及它們的屬性&#xff0c;包括所有權和權限。 通常&#xff0c;復本具有用戶所操作文件的默認屬性。 -i, --interactive 在…

java 對象的上轉型對象(父類)

Example5_10.java class 類人猿 {void crySpeak(String s) {System.out.println(s); } } class People extends 類人猿 {void computer(int a,int b) { int ca*b;System.out.println(c); }void crySpeak(String s) {System.out.println("***"s"***"); }…

EnglishLeaning

今天看了些hadoop官方reference感覺自己詞匯量和語法真是又回到解放前了。于是&#xff0c;痛下決心要好好學習英語。找到了一些學習的方法&#xff0c;自己記錄下來&#xff0c;也和大家一起借鑒 努力目標&#xff1a; 掌握大量的計算機英語術語和縮略語&#xff1b;熟練掌握計…

雇用Java EE開發人員的一些面試問題

互聯網上充斥著Java開發人員的面試問題。 這些問題的主要問題是&#xff0c;它們僅證明候選人具有良好的記憶力&#xff0c;并且記住所有語法&#xff0c;結構&#xff0c;常量等。對他/她的邏輯推理沒有真正的評估。 我在下面列舉了一些面試問題的示例&#xff0c;這些示例根據…

手機mstsc遠程工具_遠程桌面連接,只需3步,輕松遠程操控電腦!

遠程桌面的好處遠程桌面有很多好處的1.對于運維技術人員來說&#xff0c;可以隨時隨地管理遠程主機&#xff0c;查看系統信息和硬件信息等系統性能診斷&#xff0c;遠程應用管理內存、CPU等敏感信息報警提醒&#xff0c;對遠程主機的一切盡收眼2.對于客戶服務來說&#xff0c;可…

Linux入門筆記——type、switch、help、man、apropos、whatis、info

type 顯示命令的類型switch 顯示可執行程序的位置help 得到shell 內部命令的幫助文檔例如&#xff1a;help cd--help 許多可執行程序支持一個 --help 選項&#xff0c;這個選項是顯示命令所支持的語法和選項說明。例如&#xff1a;mkdir --helpman 顯示程序手冊頁許多希望被命令…

linux上的常用的進程與內存優化命令

進程 ps命令 f 以樹狀結構顯示 u 顯示詳細信息 a 顯示所有進程 -A 顯示所有進程 -u 用戶名 是顯示該用戶下的進程 -l 更多進程詳細信息 例子1. 以樹狀結構顯示root用戶下進程的詳細信息 $ps fu -u root 顯示結果如下 USER PID %CPU %MEM VSZ RSS TTY STAT STAR…

qbytearry有數據上限嗎_金仕達大數據開發崗位面試題

金仕達-上海(1)自我介紹(2)在離線數倉&#xff0c;實時數倉中擔任的角色是什么&#xff0c;介紹項目&#xff1f;數據量有多大&#xff1f;(3)實時的指標和離線指標怎么消除掉&#xff1f;有沒有必要一致&#xff1f;(4)Flink上有多少個指標&#xff0c;一個指標一個jar包嗎&am…

BZOJ 1012 單調隊列+二分

思路&#xff1a; 維護一個單減的序列 序號是單增的 每回二分查找第一個比詢問的大的值 我手懶 用得lower_bound //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; #define int long long int m,mod,top,jy,ans,tot; char ch[3]; st…

MyBatis 3 – Spring集成教程

作為本教程的第一步&#xff08;帶有MyBatis 3的Spring MVC 3 CRUD示例&#xff09;&#xff0c;我們將定義一個MyBatis服務&#xff0c;該服務將幫助我們在數據庫上執行CRUD操作。 我們有一個用于User的域類和一個用于將User信息存儲在數據庫中的數據庫表。 在示例中&#xff…

Linux入門筆記——cat、sort、uniq、wc、head、tail、tee

cat &#xff0d; 連接文件 cat 命令讀取一個或多個文件&#xff0c;然后復制它們到標準輸出。你可以使用 cat 來顯示 文件而沒有分頁cat 經常被用來顯示簡短的文本文件。案例 意義 cat ls-output.txt 讀取文件標準輸出 cat movie.mpeg.0* > movie.mpeg 連接文件&#x…

fir.im Log Guru 正式開源,快速找到 iOS 應用無法安裝的原因

很開心的宣布 Log Guru 正式開源&#xff01; Log Guru&#xff0c;是 fir.im 開發團隊創造的小輪子&#xff0c;用在 Mac 電腦上的日志獲取&#xff0c;Github 地址&#xff1a;FIRHQ/LogGuru. Log Guru 使用方法 當有測試者反饋應用裝不上的時候&#xff0c;將其測試設備連接…

python求解三元一次方程_北師大版八上數學5.2 求解二元一次方程組 知識點微課精講...

知識點總結代入消元法代入消元法的實質是將二元一次方程組中的某一個方程進行未知數的分離&#xff0c;即將該方程進行變換&#xff0c;完整分離出一個獨立的未知數&#xff0c;而這個未知數將用含有另一個未知數的式子來表示。設某二元一次方程組為&#xff1a;將第(1)式進行變…

Java 7:完整的invokedynamic示例

我當前的Java 7系列中的另一個博客條目。 這次&#xff0c;它處理的是invokedynamic&#xff0c;這是JVM上用于方法調用的新字節碼指令。 invokedynamic指令允許在呼叫站點和呼叫接收者之間進行動態鏈接。 這意味著您可以將正在執行方法調用的類鏈接到在運行時正在接收調用的類…

VC6兼容性及打開文件崩潰問題解決

VC6雖然老&#xff0c;但是一些工程還非得用它打開&#xff0c;沒辦法…… 今天偶然用到&#xff0c;因為新裝了系統&#xff0c;之前的問題又要重新解決一遍 在這記錄下解決過程&#xff0c;方便以后查閱&#xff1a; 一.兼容問題&#xff1a; XP以上windows系統打開VC6時可能…

Linux入門筆記——echo

echo Display a line of text(顯示一行文本)這個命令的作用相當簡單明了。傳遞到 echo 命令的任一個參數都會在&#xff08;屏幕上&#xff09;顯示出來。 小插曲&#xff1a; 每當你輸入一個命令&#xff0c;然后按下 enter 鍵后&#xff0c;bash 會在執行你的命令之前對輸入 …

10.25模擬 三角形

1. 三角形(trokuti.cpp/c/pas)? 【 問題描述 】? 平面上有N條直線&#xff0c;用方程A i x B i y C i0表示。這些直線沒有三線共點的。現在要你計算出用這些直線可以構造出多少三角形&#xff1f;【 輸入格式 】? 第1行&#xff1a;一個整數N(1 ≤ N≤ 300000)。? 下面N行…

dataframe 空值替換為0_Python數據分析:Pandas之DataFrame

內容目錄 DataFrame簡介DataFrame創建方式DataFrame索引和切片DataFrame屬性DataFrame級聯與合并DataFrame基本操作DataFrame分組聚合操作DataFrame數據透視與交叉表1 DataFrame簡介 我們在上次課中講到了Pandas的Series結構,還沒看的點這里 ailsa:python數據分析:Pandas之S…

具有NetBeans,WebLogic 12c,JPA和MySQL數據源的Arquillian

您可能已經關注了我的文章&#xff0c;其中涉及使用嵌入式GlassFish測試更復雜的場景&#xff08; 第I部分/第II部分 &#xff09;。 我要做的下一步是使此設置與最新的WebLogic 12c一起使用。 入門 按照我的前兩個帖子的入門部分中的步驟進行操作。 要使此工作正常&#xff…