我有一个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;
}
答案 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,当然如果你需要更多的帮助,请回到这里。
(*)免责声明:这是谎言。我真的是一个赌博的人,这听起来不错。