当前位置: 首页 > 知识库问答 >
问题:

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

岳君之
2023-03-14

我使用的是JavaFX 8,有一个只读的TextArea,根据具体情况显示确认消息或错误消息。我希望确认消息有黑色文本,但我希望错误消息有红色文本。我如何在JavaFX 8中做到这一点?就目前而言,我更喜欢用编程的方式来完成,但是我当然也对如何在FXML中完成这个程序的下一个草案感兴趣。

从本质上讲,我正在显示一个 tableView,并让用户编辑 TableView 单元格中的信息。如果用户在单元格中放置了无效值,我想给他/她一个关于错误内容的明确错误消息,我希望该消息是红色的(或以某种方式突出显示)。如果他们以可接受的方式更改了值,我需要一条确认消息,告诉他们他们已在表和数据库中成功更改了值;我希望该消息是黑色的(或类似的)。

我对JavaFX相当陌生,并且惊讶地发现不再有setForeground()。我们现在应该怎么做?或者我应该使用某种超文本标记语言字段?我还没有玩过这些......

======================================================================= 后续问题

我可能误解了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个答案

颛孙正谊
2023-03-14

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

根据CSS留档,TextAreas有一个CSS属性-fx-text-填充,它定义了显示的文本的颜色。

所以“快速而肮脏”的方式可能是:

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伪类,然后在外部样式表中引用它:

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");
 类似资料:
  • 我需要在我的程序中使用文本区域,我也需要它是只读的。 这是我创建textArea的主程序的一部分: 这是我的css文件的一部分: 如果我删除行:ta.setDisable(true);Css的工作方式就像我希望它工作一样。但是在我将禁用 true 设置为 true 之后,它只会使文本区域透明,这使得文本非常难以阅读,并且背景颜色也不是我想要的。 有没有其他方法可以只读设置文本?或者有没有办法在禁用

  • 我有一个带有一些TextArea元素的GUI来显示信息。由于GUI将对keyevents做出反应,我在场景元素中添加了一个EventHandler。因为我不想为每个文本区域添加一个EventHandler,所以我禁用了它们以防止它们聚焦,因为这样场景的EventHandler就不再工作了。现在我有一个问题:文本显示为灰色,不再是黑色,尽管我在css文件中更改了它。你知道为什么文本不是黑色的吗?我该

  • 在我的项目中,我想实现一个语法突出显示功能。我的意思是,当用户在代码区键入代码时,文本将像IDE(Eclipse、Intellij、Netbeans)一样立即高亮显示。 例如,如果我们在IntellijJavaIDE中键入“import”,那么它会将单词“import”涂成蓝色。在我的项目中,我想实现同样的事情。 我的目标是用蓝色突出特定的关键词。例如,如果关键字是“mov”、“load”、“xo

  • 问题内容: 我的页面上有一个textarea html元素,该元素通过ajax重新加载。每次返回整个textarea不仅是其内容,而且内容会随着时间增长。连同textarea一起,我返回了以下javascript: 在firefox 3.0.7中,这会将滚动条放在textArea的底部,使我可以看到最新的输出。但是在IE 7中,我看到了不同的行为。滚动条将按预期的内容向下移动,但是一旦内容较大,则

  • 我正在使用Java FX textarea,并用它来为正在进行的步骤提供信息。 步骤如下。复制文件。删除旧文件。复制新文件。然后将一些属性从旧文件复制到新文件。 当点击一个按钮时,整个步骤开始。 我面临的问题是,当我使用append命令时,文本区域没有被更新。 append 命令添加数据,当函数终止时,我将所有文本放在一起。我希望在调用函数时更新文本区域。 在我的程序中,复制文件操作需要一些时间,

  • 我开始为一个项目制作这个网页,到目前为止是这样的: 但是我想把文本区域放在另一个上面,而不是并排放置 我希望它看起来怎么样: 谁能帮帮我吗 https://i.stack.imgur.com/ZzsKS.png