如何动态更改JavaFX TextArea中文本的前景色?

时间:2016-04-05 22:01:23

标签: javafx textarea

我正在使用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()。

1 个答案:

答案 0 :(得分:2)

在JavaFX中,您使用CSS设置控件样式。建议的方法是使用外部样式表,它将样式(在CSS文件中)与逻辑(在Java中)分开。您也可以通过直接调用控件上的setStyle(...)来使用“内联”样式。

根据CSS documentationTextArea有一个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");