【问题标题】:How do I change the foreground color of text in a JavaFX TextArea dynamically?如何动态更改 JavaFX TextArea 中文本的前景色?
【发布时间】:2016-07-26 01:43:48
【问题描述】:

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

【问题讨论】:

  • 如果您希望黑色和红色文本同时出现在文本区域中,那么文本区域无法做到这一点。也许考虑使用HTMLEditor。如果您只需要其中一个,请使用setStyle(...)。澄清我可以提供更完整的答案。
  • 我一次只需要一种前景色。至少这是我最初的构想;这可能会改变。
  • 你每次都关闭任何一个伪类吗?虽然这种方法可行,但它可能过于复杂。如果只有两种可能,你只需要一个伪类。您需要的两个 CSS 选择器是 .text-area{ }.text-area:error {. }。如果有两种以上的可能性,那么您可能需要更多的伪类,但您的逻辑必须确保所有伪类状态都设置为正确的值。
  • [抱歉回复晚了;起初我没有看到您的评论。] 我可能在关闭伪类方面做得不是很好。我不知道我需要!除了我引用的 writeMessage() 方法之外,我还有一个 clearMessage() 方法,它仅删除消息 textArea 的内容并将字体粗细设置为正常,但它不调用伪类;听起来应该。

标签: javafx textarea


【解决方案1】:

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

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

【讨论】:

  • 感谢 James_D! “又快又脏”的方法效果很好。我几乎从你之前使用 setStyle() 的线索中得到了其中的一部分,但我的语法略有偏差,所以我的 CSS 被忽略了。另外,我刚刚了解到我可以在 setStyle() 参数中放置多个指令,方法是用分号分隔它们,就像我在“真实”CSS文件中所做的那样,例如messageArea.setStyle("-fx-font-weight: 700; -fx-text-fill: red")。如果我将这两行分开,则只有后一行生效。现在我要尝试更好的方法......
  • 是的,当然。如果您多次设置样式,则样式将保留您设置的最后一个值,就像设置任何其他属性一样。如果您要设置多个样式属性(几乎可以肯定),那么更新伪类并将所有样式设置委托给 CSS 文件会更加简洁。
  • 我正在尝试首选方法,它几乎有效,但不完全有效。我将在此页面的其他地方详细说明更大的问题,但较小的问题是我的 CSS 中有两个样式更改,将填充颜色更改为红色,将字体粗细更改为 700 以表示错误,并返回黑色/正常以表示信息性消息.然而,字体粗细似乎被忽略了,即使它遵循正常的 CSS 编码规则。为什么会这样?这是代码: .text-area:error { -fx-text-fill: red ; -fx-字体重量:700; }
  • 它对我有用......不确定。我隐约记得前一段时间字体粗细表现不正确。你的 JDK 版本是最新的吗?
  • 关于 JDK 版本的好问题,但我实际上并不确定。我正在使用 Eclipse(Mars 4.5.2),我的 JRE 系统库显示“[JavaSE-1.8]”,但库中的每个 jar 都显示“C:\Program Files\Java\jre7\lib”。然而,我似乎拥有所有 JavaFX8 组件。我真的不知道为什么所有这些 jar 都在一个名为 jre7 的目录中......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多