如何实现带有颜色文本的日志框_使用HTMLEditor模拟

Posted javafx-howto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现带有颜色文本的日志框_使用HTMLEditor模拟相关的知识,希望对你有一定的参考价值。

如何实现带有颜色文本的日志框_使用HTMLEditor模拟

HTMLEditor 是一个强大的 html 编辑器,可以方便的编辑各种 html 元素并得到 html 文本。

比之 TextArea 要强大很多,因为 TextArea 中所有的文本只能有一种样式。

如果想要实现一个日志框,其中普通信息、警告信息、错误信息使用不同颜色的文本,甚至支持超链接的话,使用 TextArea 就无法实现了。

借用 HTMLEditor 似乎是一个比较简单的做法。

效果展示

示例代码

代码有两部分组成:

  1. LogArea, 适配 HTMLEditor ,裁剪功能实现一个日志框
  2. HTMLEditorExample, 用于测试 LogArea

LogArea 代码如下:

import java.util.Set;

import javafx.concurrent.Worker;
import javafx.scene.Node;
import javafx.scene.web.HTMLEditor;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

public class LogArea

    private HTMLEditor editor;
    
    public Node getNode()
    
        if (editor == null)
        
            this.init();
        
        return editor;
        

    private void init()
    
        editor = new HTMLEditor();

        // 设置添加文本时自动下拉
        
            WebView webView = (WebView) editor.lookup("WebView");
            WebEngine webEngine = webView.getEngine();
            webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> 
                if (newValue == Worker.State.SUCCEEDED) 
                    webEngine.executeScript("window.scrollTo(0, document.body.scrollHeight)");
                
            );
        
        
        // 隐藏工具栏
        
            editor.setVisible(false);
            Set<Node> nodes = editor.lookupAll(".tool-bar");
            for(Node node : nodes)
            
                node.setVisible(false);
                node.setManaged(false);
            
            editor.setVisible(true);
        
    

    public void logInfo(String message)
    
        editor.setHtmlText(editor.getHtmlText() + message + "<br/>");
    

    public void logError(String message)
    
        editor.setHtmlText(editor.getHtmlText() + String.format("<span style=\\"color: red\\">%s</span>", message) + "<br/>");
    

    public void clear()
    
        editor.setHtmlText("");
    

HTMLEditorExample 代码如下:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class HTMLEditorExample extends Application

    @Override
    public void start(Stage window) throws Exception
    
        VBox root = new VBox();
    
        LogArea logArea = new LogArea();
        root.getChildren().addAll(logArea.getNode());

        Button infoButton = new Button("add info");
        infoButton.setOnAction(e -> 
            logArea.logInfo("this is some info");
        );
        Button errorButton = new Button("add error");
        errorButton.setOnAction(e -> 
            logArea.logError("this is some error");
        );
        Button clearButton = new Button("clear");
        clearButton.setOnAction(e -> 
            logArea.clear();
        );
        root.getChildren().addAll(infoButton, errorButton, clearButton);

        Scene scene = new Scene(root, 400, 300);

        window.setScene(scene);
        window.setTitle(this.getClass().getSimpleName());
        window.show();
    

    public static void main(String[] args)
    
        launch(args);
    

代码说明

HTMLEditor 没提供类似 appendText 这样的方法来追加文本,所以 LogArea 添加了这个功能,作为添加日志的接口。

在 LogArea 的 init 方法中初始化并调整 HTMLEditor ,令其每次添加文本后都执行一段 js 代码,作用是将下拉框保持到最底部。

另外隐藏了 HTMLEditor 的工具栏,因为日志框不需要手动编辑内容。

以上是关于如何实现带有颜色文本的日志框_使用HTMLEditor模拟的主要内容,如果未能解决你的问题,请参考以下文章

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]

[WTL/ATL]_[初级]_[如何设置CEdit的文本框背景色和文字颜色]

如何保存富文本框的背景颜色及其其他内容

Libre office Draw如何更改pdf表单可填写文本框的字体颜色

如何让 text-shadow 和 box-shadow 在所有浏览器上使用文本颜色?