2014-10-30 108 views
4

我有任務將圖形化網絡編輯器應用程序編程爲大學項目。爲此,我需要三種類型的物品/控件。一個圓形,一個矩形和箭頭連接其他形狀(整個事情有點像MS Visio在某些方面)。形狀/控件需要一些額外的功能,例如移動,縮放上下文菜單等。另外,我需要完全控制這些對象的圖形表示,即我想自己「繪製」它們,或者至少能夠將它們修改爲I需要。JavaFX - 如何創建簡單的自定義繪製控件?

我正在使用JavaFX,對它幾乎沒有任何經驗。所以我想知道,什麼是實現這些自定義控件的最佳方式。它是需要使用JDK 7,因此,使用SkinBaseBehaviourBase是不是一種選擇,因爲它們是私人JDK 8之前

我在想繼承PathCanvas作爲我的控制使用。但我對知情決策的含義知之甚少。

有人可以給我一些建議,哪些基類要考慮和可能有什麼影響?

Thx很多。

回答

11

這個答案只是要諮詢,有沒有真正的正確或錯誤的答案在這裏。如果你不同意這個建議,或者這個建議不適用於你的情況,你可以忽略它。

對不起,但問題是開放式的,可能的答案很複雜。

我正在考慮繼承Path或Canvas以用作我的控件。

不要。 Favor composition over inheritance。擁有一個實現控件功能接口的控件類,並且無論使用何種UI技術都可以工作。爲控件類提供對控件的UI表示的外觀類的引用。外觀將指定如何呈現給定狀態下的控件(從相關控制對象獲取控件狀態)。此外,皮膚將響應用戶操作,例如鼠標按下並指示控件根據鼠標按鍵改變其狀態 - 因此皮膚知道它與哪個控件相關聯,反之亦然。在控件類中有可綁定屬性來表示控件狀態。

一個簡單的例子就是這個tic-tac-toe遊戲實現的Square and SquareSkin

例如,想象複選框控件。控件的可綁定屬性可能是一個狀態爲(checked,unchecked,undetermined)的枚舉。皮膚可能會將複選框顯示爲帶勾號的方框,以表示已檢查的狀態。或者,也許皮膚會渲染帶有X的圓邊。皮膚可以使用任何想要呈現複選框的技術,例如,一個畫布或一組節點。皮膚爲鼠標點擊,按鍵等註冊監聽器,並通知複選框控件設置其檢查狀態。它還有一個關於檢查狀態的監聽器,並將根據該狀態選擇是否呈現檢查記號。

關鍵是複選框的API接口只是一個帶有檢查狀態的複選框控件類。用戶界面的處理方式從複選框API抽象出來,因此您可以在不更改任何其他代碼的情況下交換UI實現的內容和外觀。

子類化路徑與子類化Canvas完全不同。對於訂閱的情況,我絕對贊成將Shape節點(或區域)與Canvas相對應。使用節點,你會自動獲得一個非常豐富的UI渲染和事件模型,可以綁定的屬性集和和繪畫框架,這些都不會用Canvas獲得。如果您不使用節點,您最終可能會嘗試以某種次標準方式重新創建和構建Node功能的某些部分。 Canvas非常適用於從其他框架移植2D遊戲或圖形引擎或構建像粒子系統等像素操縱器的東西,但以其他方式避免它。

考慮爲控制皮膚使用佈局窗格,例如,一個StackPane或類似的東西。佈局窗格是容器,因此您可以將內容放入其中,並使用聚合和合成來構建更復雜的控件。佈局窗格還可以幫助您佈置節點。

任何將類似於窗格的區域劃分的子類都可以通過CSS設置爲任意形狀和顏色。這實際上是JavaFX中的內置複選框(和其他控件)的工作原理。複選框是兩個區域的堆疊,一個是盒子,另一個是支票。兩者都採用CSS樣式 - 爲JavaFX搜索.check-box in the modena.css樣式表。請注意,如何使用-fx-shape通過指定svg路徑(您可以在svg編輯器(如inkscape)中創建)來獲取刻度線形狀。還要注意背景分層是如何用來獲得像聚焦環這樣的東西的。使用CSS風格的優點是,您可以在不觸及Java代碼的情況下在風格上更改控件。

所以使用SkinBase和BehaviourBase是不是一種選擇

即使你已經決定不使用這些基類(我認爲這是一個不錯的決定,即使你是隻針對Java的8+) ,我認爲值得研究JavaFX source中的控件設計。研究按鈕或複選框,這樣你就可以看到專家如何做這些事情。另外請注意,這樣的實現可能對您的應用程序過度,因爲您沒有構建可重用的控制庫。你只需要一些能在你的應用程序範圍內工作的很好的東西(這就是我不一定建議爲所有應用程序擴展SkinBase的原因)。

作爲最小read up on Controls on the open-jfx wiki

這是需要使用JDK 7

IMO,沒有開發新的JavaFX應用程序爲目標Java 7中有許多錯誤修正爲Java 8,再加上新的和有用的多點功能添加。通常,Java 7是JavaFX應用程序的次優目標平臺。如果您將應用程序打包爲self-contained application,那麼您可以將任何Java平臺隨應用程序一起發佈,因此目標平臺無關緊要。

諸如WebStart或瀏覽器嵌入式應用程序(小程序)等IMO部署技術可以在系統上使用預先安裝的Java運行時,這是傳統的部署模式,這對於大多數應用程序來說是最好的避免。

不過,可能會出現這樣的情況:由於受控制之外的某些限制,您絕對必須擁有Java 7,所以我想只是對您的情況進行仔細評估。如果你有這樣的約束,並且必須建立在一個穩定的,傳統的UI工具包上,這個工具包可以和多年前發佈的運行時間一起工作,你總是可以使用Swing。

+0

thx爲詳細答案。非常好的建議。但由於我不能使用jdk 8(大學不允許),所以我決定使用swing。但無論如何它是一個很好的答案;) – Tobi 2014-11-07 20:56:10

+0

這個Control + Skin事件對於MVC/MVP/MV *來說只是一個奇怪的名字。 – cubuspl42 2016-09-09 14:44:14

0

從oracle中,Path類表示一個簡單的形狀,並提供基本構造和管理幾何路徑所需的工具,而Canvas是可以使用由GraphicsContext提供的一組圖形命令繪製的圖像。

這意味着用戶可以使用畫布根據用戶需要繪製所需的形狀。

上的基本方法,我可以說是如下:

  1. 使用的帆布因爲它會幫助和支持自定義的用戶「繪圖」。像在MS Paint中一樣爲圓形,矩形,箭頭等創建菜單按鈕。畫布上的Onclick拖動功能可用於「繪圖」。

  2. Circle和Rectangle是您可以使用

  3. 您可以使用箭頭等所使用here的方式庫可用。 我認爲它與你想創建的相同的例子。

  4. 自定義控制器和上下文菜單可以創建過docs.oracle.com

  5. 縮放和移動可以通過拖放功能結合到一個規模 或翻譯動畫來完成。和的mousePressed可以的mouseReleased可用於跟蹤COORDS繪製形狀。

0

這是我的建議,你可以使用控制原型。或者一個應用程序或設計工具,它可以爲你提供有針對性的控制或圖標,具有圓形,矩形和箭頭。我不知道我的建議如何工作。你可以嘗試一下。