我正在使用JavaFX 8并且具有只读TextArea,根据情况显示确认消息或错误消息。我希望确认消息有黑色文本,但我希望错误消息有红色文本。我如何在JavaFX 8中做到这一点?目前,我更喜欢以编程方式进行,但我当然会对如何在FXML以及下一个程序草案中完成这项工作感兴趣。
基本上,我正在显示一个tableView,让用户编辑TableView单元格中的信息。如果用户在单元格中放入了无效值,我想给他/她一个关于错误的明确错误消息,并且我希望该消息为红色(或以某种方式突出显示)。如果他们以可接受的方式更改了值,我想要一条确认消息,告诉他们他们已经在表和数据库中成功更改了值;我更喜欢消息是黑色的(或类似的)。
我是JavaFX的新手,我很惊讶地发现没有setForeground()了。我们现在应该如何做到这一点?或者我应该使用某种HTML字段?我还没玩过那些......
=============================================== ======================== 后续问题
我可能误解了James_D的回答的意图,但我创建了两个伪类,一个用于错误消息,一个用于提供信息性消息:
private static final PseudoClass ERROR = PseudoClass.getPseudoClass("error");
private static final PseudoClass INFO = PseudoClass.getPseudoClass("info");
我原本希望能够有一个简单的方法,只需将伪类传递给方法,就可以编写有关消息,信息或错误的信息。这是方法:
private void writeMessage(String message, PseudoClass pseudoClass) {
messageArea.pseudoClassStateChanged(pseudoClass, true);
messageArea.setText(message);
}
我按如下方式调用方法以获取错误消息:
writeMessage("This is an error message.", ERROR);
以这种方式提供信息:
writeMessage("This is an information message.", INFO);
这就是我添加到CSS文件中的内容:
.text-area:error {
-fx-text-fill: red ;
-fx-font-weight: 700;
}
.text-area:info {
-fx-text-fill: black;
-fx-font-weight: normal;
}
为什么我的错误消息显示为粗体? (所有消息都以普通字体显示。)为什么有些错误消息不显示为红色?我始终以相同的方式调用writeMessage()。
答案 0 :(得分:2)
在JavaFX中,您使用CSS设置控件样式。建议的方法是使用外部样式表,它将样式(在CSS文件中)与逻辑(在Java中)分开。您也可以通过直接调用控件上的setStyle(...)
来使用“内联”样式。
根据CSS documentation,TextArea
有一个CSS属性-fx-text-fill
,用于定义显示的文本的颜色。
所以“快速而肮脏”的方式可能是:
private TextArea messageArea ;
// ...
private void showMessage(String message, boolean error) {
if (error) {
messageArea.setStyle("-fx-text-fill: red ;") ;
} else {
messageArea.setStyle("");
}
messageArea.setText(message);
}
更好的方法是定义自己的CSS PseudoClass
,然后在外部样式表中引用它:
private static final PseudoClass ERROR = PseudoClass.getPsuedoClass("error");
private TextArea messageArea ;
// ...
private void showMessage(String message, boolean error) {
messageArea.pseudoClassStateChanged(ERROR, error);
messageArea.setText(message);
}
您的CSS文件现在可以定义错误消息的样式:
.text-area:error {
-fx-text-fill: red ;
}
然后您可以使用
将样式表附加到场景中Scene scene = ... ;
scene.getStylesheets().add("path/to/css/file");