簡體   English   中英

在 Java 桌面聊天應用程序中混合使用 Swing 和 JavaFX

[英]Mixing Swing and JavaFX in a Java desktop chat application

我知道已經有一些關於這個的問題,但我找不到我的方法!

我想用 java 實現一個桌面聊天應用程序,它能夠發送文本、圖像、視頻等。現在我正在為我的聊天對話窗口使用 Swing 組件。 我創建了一個JFrame並向其中添加了JTabbedPane ,以便為每個新對話添加選項卡。 為了創建每個選項卡,我的行為如下:

  • 創建JPanel (我將它添加到我的JTabbedPane作為選項卡)

      newtab = new JPanel();\n newtab.setLayout(new BoxLayout(newtab, BoxLayout.PAGE_AXIS));
  • 為聊天的顯示部分創建JTextPane (具有像 android 應用程序這樣的對話風格,如 viber,....)

我希望能夠使用以下樣式:

  • 不同的對齊方式
  • 更改字體、顏色
  • 插入 JComponent(顯示其他類型的消息)
  • 每個消息輪的設置邊界(我不想要方形的)
  • ...
context = new StyleContext();
kit = new HTMLEditorKit();
chatPane = new JTextPane();
chatPane.setEditable(false);
chatPane.setContentType("text/html");
chatPane.setEditorKit(kit);
chatPane.setText("");
doc = (HTMLDocument) chatPane.getStyledDocument();
CSS(); // it is for adding ccs style to stylesheet of document
JScrollPane scroll = new JScrollPane(chatPane);
newtab.add(scroll , BorderLayout.CENTER);

我的問題是為我的顯示部分設置完美的樣式,因為javax.swing.text.html.CSS提供 HTML 3.2 支持,所以支持的 CSS 屬性是有限的! 在互聯網上搜索時我找到了JavaFX ,但我不知道使用JavaFX和一起swing是否好,甚至可能嗎?! 還有哪個布局管理器更適合JPanel ( newtab ) 讓我的JTextPane滾動。

可以混合使用 JavaFX 和 Swing。 但我沒有這方面的經驗。 我只是為一個非常不錯的小項目做了一點 FX-UI。 尤其是 CSS-Feature 很棒。

根據混合,我最近發現了一個不鼓勵混合這兩種技術的博客: http : //dlemmermann.wordpress.com/2014/07/17/javafx-tip-9-do-not-mix-swing-javafx/

也許這會給你一些幫助。

正如已經說過的那樣,可以混合使用 Swing 和 JavaFX,尤其是在 Java 8 中,您可以同時使用兩種方式:

  • 使用SwingNode在 JavaFX 中嵌入 Swing 組件
  • 使用JFXPanel在 Swing 中嵌入 JavaFX 組件

最近我們不得不做出同樣的決定。 我們有一個應用程序並希望遷移到 JavaFX 以獲得更現代的設計並利用所有引入的語言功能,如PropertiesBindings等,JavaFX 組件很好地支持這些功能。

所以首先我們嘗試在 Swing 中嵌入 JavaFX。 所有新組件都在 JFXPanel 的幫助下嵌入。 這真的很容易,但有時我們會遇到一些越來越煩人的渲染問題。 “不幸的是”我們習慣了新的 JavaFX API,這就是為什么我們決定重新設計我們的應用程序,使其成為一個包含一些 Swing Parts 的 JavaFX 應用程序,這在 Java 8 發布時是可能的,因為我們不會浪費是時候修復那些渲染問題了。 重新設計實際上是一些工作,因為有些概念是不同的。 受益於新的 API 導致了一些重構,我們一開始並沒有真正想做。

但是再次混合 Swing 和 JavaFX 變得有點模糊,應用程序的外觀和感覺並沒有真正令人信服,所以我們最終刪除了所有 Swing Parts,並用 JavaFX Components 替換它們。 到目前為止,我們並不后悔那一步,但它比我們預期的要多得多,盡管我們已經使用了像 MVP 這樣的模式,其中只需要重構視圖,因為演示者(大部分)擺脫了 UI 的東西(這真的是一個有趣的過程,我們是否學到了很多關於 MVP 和設計應用程序的知識)。

所以總而言之,我只能建議創建一個您擁有的視圖列表,並考慮您需要的所有組件,並嘗試在 JavaFX 中找到相應的組件。 為最復雜的組件制作小示例,看看它們是否能滿足您的所有用例。 如果是這種情況並且您仍然有足夠的時間切換到 JavaFX,我個人會選擇純 JavaFX 方法,因為我在混合 JavaFX/Swing 方面的經驗,特別是因為您的 UI 設計似乎處於早期狀態。 最后,這只是您的項目可用的時間問題,以及您是否真的准備好了解 JavaFX 的新概念和組件。

關於 JavaFX CSS 支持,您可以在此處找到參考。

最近我被問到同樣的問題。 大約一個月前,我和我的團隊開始了一個新項目。 我們使用 Java 8.0 + JavaFX 2.2。 我在 JavaFX 中發現了什么問題?

  • 這是一項新技術,許多問題仍未得到解答。 你必須自己尋找。
  • 沒有托盤支持,所以你必須使用java.awt.SystemTray

我還發現了設計中的一個問題。
例如,您想使用包含粘貼在左側的標簽和右側的復選框的單元格制作漂亮的列表。 但是沒有好的方法可以做到這一點,您必須計算單元格的長度等。

但是 JavaFX 為自定義 GUI 提供了很好的機會。 您可以將您的設計封裝在 jxml 文件中。 這非常方便,因為它甚至將代碼與設計分開。

關於混合,我認為如果平台允許,那么您必須使用提供平台的解決方案。

我認為使用 JavaFX 的決定是正確的,因為它是一種相對較新的技術,由 Oracle 開發,它可能很快會取代 Swing。

暫無
暫無

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

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