在JavaFX TextArea中突出显示字符串

时间:2012-02-03 12:16:02

标签: java javafx spell-checking highlighting javafx-2

我们在我们的应用程序中使用JavaFX的TextArea控件,并尝试将其与Jazzy拼写检查API集成 - 例如,当用户输入不在字典中的错误单词时,例如这个词会突出显示。

有没有办法在所述控件中突出显示一个单词?我在JavaDocs中看不到任何选项,所以如果有人可以建议一种方法吗?

我想,有可能使用HTMLEditor组件,并将这些词与<font face="red=>wrongWord</font>不同地着色。然而,这会带来拼写检查的许多不同问题,例如html标签和单词计数。

5 个答案:

答案 0 :(得分:13)

RichTextFX允许您为文本范围添加样式。

答案 1 :(得分:9)

JavaFX TextArea控件(从2.0.2开始)不支持文本样式(字体等)混合的富文本编辑。

您可以通过操作TextArea的selectRange来突出显示TextArea中连续的字符串,如下例所示:

public class TextHighlight extends Application {
  public static void main(String[] args) { Application.launch(args); }
  @Override public void start(Stage stage) {
    final TextArea text = new TextArea("Here is some textz to highlight");
    text.setStyle("-fx-highlight-fill: lightgray; -fx-highlight-text-fill: firebrick; -fx-font-size: 20px;");
    text.setEditable(false);
    text.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent t) { t.consume(); }
    });

    stage.setScene(new Scene(text));
    stage.show();

    Platform.runLater(new Runnable() {
      @Override public void run() { text.selectRange(13, 18); }
    });
  }
}

您可以使用上面的代码作为基础,在进行拼写检查时将TextArea切换为只读模式。实施提示,依次查找并修复每个单词,直到拼写检查完成。在单独的对话框或面板中执行提示。 Jazzy演示似乎以这种方式工作http://jazzy.sourceforge.net/demo.html,因此将其Swing UI转换为JavaFX应该相当容易。


或者,您可以使用JavaFX WebView控件来包装任何基于javascript / html的拼写检查器(例如http://www.javascriptspellcheck.com/),使用与此处演示的类似的技术:http://jewelsea.wordpress.com/2011/12/11/codemirror-based-code-editor-for-javafx/

答案 2 :(得分:5)

有可能......某种

我知道这个问题已经解决了,但我找到了解决这个问题的方法,并认为我会将其发布给其他也偶然发现这篇文章的人。这有点hacky,但如果您需要在TextArea中突出显示文本并且不想接受令人不满意的“不可能”的答案,那么它可以在紧要关头工作。

  1. 检索TextArea的背景颜色和文本字体的前景色
  2. 计算前景色和背景色之间对比度最高的bin
  3. 在所需文字周围放置一个矩形
  4. 将矩形的颜色设置为背景颜色
  5. 将矩形的blendmode设置为最高对比度的bin
  6. 禁用矩形
  7. 矩形现在将与背景完美融合,但会更改文本的颜色。禁用矩形意味着它不会显示为对用户的苦行僧 - 例如点击矩形等操作不会产生任何惊人的效果。

    如果需要各种颜色,您可以略微调整此方法。

    如果人们感兴趣,持怀疑态度,或者如果工作变得棘手,我可以发布实施细节。

答案 3 :(得分:5)

使用JavaFX 8,您可以使用 TextFlow中

您可以为粗体,红色,绿色或任何类型的Texts定义某些样式类,并在为每个文本指定所需样式类时将它们排列在TextFlow中

答案 4 :(得分:0)

我有类似的要求,@ en_Knight的回答对我来说很有希望。他只提供了理论上的细节。根据他的意见,我想尝试一下,下面是我的结论。

在许多情况下仍需要处理。但这至少应该足以让我们了解@en_Knight在说什么。

请检查以下可运行的演示:

ActionMailer::Base.smtp_settings