java - 在 Swing 等 JavaFX 组件中使用 HTML

标签 java swing javafx javafx-2

我有一个 Swing 应用程序,其中许多文本在应用程序中使用 HTML3 进行格式化。其中一些文本是在对象的 toString() 方法中创建的。现在,我想使用这些文本格式编写一个并行 JavaFX 应用程序,让我可以将模型类用于这两个独立的接口(interface)。

我有很多组件(例如 JList)依赖于 toString() 方法中呈现的文本,并且许多文本具有 HTML 格式。

我对在 JavaFX 应用程序上使用 JList 不感兴趣。

有没有办法保持模型不变并将其用于 Swing 和 JavaFX 接口(interface)?或者我应该将我的项目完全 fork 给 JavaFX。现在我创建了一个新的 JavaFX 项目,并使用包含模型和 Swing GUI 类的上一个项目作为库。

很明显,toString()方法生成的字符串在程序执行过程中发生了变化。因此,如果它让我更喜欢在 JavaFX 中继续使用 HTML 样式,这让我不必对模型中的差异进行硬编码。(例如,文本可能会变成红色/蓝色...取决于对象状态)

以下是名为 Tank 的对象的 toString() ,我有一些在不同 JList 中使用的 ListModel s。它不是我的模型中具有此规范的唯一对象。

@Override
public String toString() {
    String str = "<html><center>" +
            (getNumber() + 1) + " " + getDescription() +"<br><b>";
    if(getCurrentJobStage() == null){
        str += "<font color=\"green\">Empty</font>";
    } else {
        str += "<font color=\"red\">Bar: " +
                getCurrentJobStage().getOwnerSequence().
                getOwnerProductJob().getId() +"</font>"; 
    }

    str +=  "</b><br>---<br>---</center></html>";
    return str;
}

最佳答案

简单来说,不,JavaFX 中没有等效的机制。

正如 MadProgrammer 在评论中指出的那样,您现在确实因为未能在早期应用程序中使用正确的设计而付出代价。标准实践要求将 View (数据的表示)与模型(数据的表示)和 Controller (操纵数据的处理逻辑)分开。

您上面提到的 Tank 类应该是您模型的一部分:它应该代表您的数据,但不知道如何将数据呈现给用户。您为其定义的 toString() 破坏了 toString 方法的一般契约;而不是提供 'string that "textually represents" this object' ,您使用它来为用户提供特定数据呈现的格式(即通过 Swing 的 JList)。现在您想要切换 View 技术,您发现这要困难得多,因为您没有正确地将数据表示与数据表示的关注点分开。

如果这让您感觉更好的话,几乎每个程序员都会不止一次地这样做,然后才弄清楚为什么要采用这些设计模式。这是一种成人仪式。欢迎来到设计模式的世界。

这是我建议的行动方案。你的老板不会同意这一点,但这是正确的做法。

重构当前的 Swing 应用程序,以便实体对象完全不关心表示。特别是,如果您只是将其发送到 System.out.println(..),您的 toString() 方法应该生成一些能够提供良好、易于阅读的表示的内容,并且您应该引入一个 ListCellRenderer 来生成 HTML 并将其提供给JList 用于显示 Swing 中的对象。我不是一个赌博者(*),但如果我是,我敢打赌,您可以对代码进行许多其他类似的增强。

一旦完成,就可以继续进行将其转移到 JavaFX 的项目。看起来您想根据类中的属性更改渲染器的样式。在 JavaFX 中执行此操作的方法是使用 CSS。实际上,JavaFX 8(今天已上线,因此没有理由不使用它)比 JavaFX 2 更清晰:您可以定义自定义 css 伪类,并在相关属性更改时更新它。然后定义一个外部 CSS 样式表,用于确定特定伪类设置的颜色(和其他样式)。您还需要一段时间才能准备好执行此操作,但此时您想查看 API docs for Pseudoclass当然,如果您需要更多帮助,请在此处发帖。

(*)免责声明:这是一个谎言。我确实是个赌徒,这听起来不错。

关于java - 在 Swing 等 JavaFX 组件中使用 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490855/

相关文章:

java - 从 JSF 1.2 迁移到 2.0 的问题

java - Try block 如何知道代码中的哪一行语句必须抛出异常

java - 从 jdk 1.4 升级到 jdk1.6 时出现 sun.security.util 问题

java - 如何使关键箭头起作用?

animation - 更新JavaFx中的应用程序线程以绘制节点

JavaFX Node.setOnMouseEntered/Exited 的不稳定行为

Java : HttpClient 4. 1.2 : ConnectionTimeout, SocketTimeout 值设置无效

java - 使用按钮启动和停止线程

java - 尝试在不同的 JPanel 上重新绘制

javafx - 传递参数JavaFX FXML