java在JavaFX组件(如Swing)中使用HTML
我有一个Swing应用程序,其中许多文本在应用程序中使用HTML3格式化。其中一些文本是在objectstoString()
方法中创建的。现在,我想用这些文本格式编写一个并行JavaFX应用程序,使我能够为这两个分离的接口使用模型类
我有很多组件(比如JList)依赖于toString()
方法中呈现的文本,许多文本都是HTML格式的
我对在JavaFX应用程序上使用JList不感兴趣
有没有办法保持模型不变,并将其用于Swing和JavaFX接口?或者我应该把我的项目全部交给JavaFX。现在,我创建了一个新的JavaFX项目,并使用上一个包含模型和Swing GUI类的项目作为库
显然,从toString()
方法生成的字符串在程序执行期间会发生变化。因此,如果这让我更喜欢在JavaFX中继续使用HTML样式,这样我就不会硬编码模型中的差异。(例如,根据对象状态,文本可能会变成红色/蓝色)
下面是一个名为Tank的对象的toString()
,我有一些ListModel
在不同的JList
中使用。在我的模型中,它不是这个规范中唯一的对象
@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 楼答案
简而言之,不,JavaFX中没有等效的机制
正如MadProgrammer在评论中指出的,您现在真的在为未能在早期应用程序中使用正确的设计而付出代价。标准实践要求将视图(数据的表示)与模型(数据的表示)和控制器(处理数据的处理逻辑)分开
你上面提到的坦克类应该是你模型的一部分:它应该代表你的数据,但不知道数据是如何呈现给用户的。您为其定义的toString()打破了toString方法的一般约定;您没有提供'string that "textually represents" this object',而是使用它为用户提供数据的特定表示格式(即通过Swing的JList)。现在,如果您想切换视图技术,您会发现这要困难得多,因为您没有正确地将数据表示和数据表示分离开来
如果这能让你感觉更好,那么几乎每个程序员在弄清楚这些设计模式的原因之前都会不止一次这样做。这是一种成年礼。欢迎来到设计模式的世界
以下是我推荐的行动方案。你的老板不会同意这一点,但这是正确的做法
重构当前的Swing应用程序,使实体对象与演示完全无关。特别是,如果您只需将toString()方法发送到系统,它应该会生成一个好的、易于阅读的表示。出来println(…)您应该引入一个ListCellRenderer来生成HTML,并将其提供给JList以在swing中显示您的对象。我不是一个赌徒(*),但如果我是的话,我敢打赌你可以对你的代码做很多其他类似的增强
完成后,继续进行项目,将其转移到JavaFX。看起来您想根据类中的属性更改渲染器的样式。在JavaFX中实现这一点的方法是使用CSS。在JavaFX8中,它实际上比JavaFX2干净得多(现在已经上线了,所以没有理由不使用它):您可以定义一个定制的css伪类,并在相关属性更改时更新它。然后定义一个外部css样式表,用于确定特定伪类设置的颜色(和其他样式)。这需要一段时间,直到你准备好做这件事,但在这一点上,你想看看API docs for Pseudoclass,当然,如果你需要更多的帮助,请发回这里
(*)免责声明:这是一个谎言。我真的是一个赌徒,这听起来很好