在Swing等JavaFX组件中使用HTML

时间:2014-03-18 20:56:24

标签: java swing javafx javafx-2

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

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

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

有没有办法保持模型不变并将其用于Swing和JavaFX接口?或者我应该完全分叉我的JavaFX项目。现在我创建了一个新的JavaFX项目,并使用最后一个项目将模型和Swing GUI类作为库。

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

以下是一个名为Tank的对象的toString(),我有一些ListModel用于不同的JList 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;
}

1 个答案:

答案 0 :(得分:2)

简而言之,不,JavaFX中没有等效的机制。

正如MadProgrammer在评论中指出的那样,你现在真的付出了代价,因为你没有在之前的应用程序中使用正确的设计。标准实践要求将视图(数据的表示)与模型(数据的表示)和控制器(处理数据的处理逻辑)分开。

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

如果它让你感觉更好,几乎每个程序员都会多次这样做,然后才弄清楚为什么会有这些设计模式。这是一种通过仪式。欢迎来到设计模式的世界。

以下是我推荐的行动方案。你的老板不会同意这一点,但这是正确的方法。

重构当前的Swing应用程序,以便实体对象完全不关心演示文稿。特别是,你的toString()方法应该生成一些东西,只需将它发送到System.out.println(..)就可以提供一个很好的,易于阅读的表示,你应该引入一个ListCellRenderer来生成HTML并将其提供给JList以摆动方式显示对象。我不是一个赌博的人(*),但如果我是,我敢打赌你可以为你的代码做很多其他类似的改进。

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

(*)免责声明:这是谎言。我真的是一个赌博的人,这听起来不错。