繁体   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