背景

你可能知道在Swing中通过为一个JLabel设置HTML文本,即可显示复杂多样的文字效果。但是很遗憾,在JavaFX2+中,Label不具备这个特性。在JavaFX2版本中,HTMLEditor和WebView可以解析HTML文本,但是使用这两个组件来显示很小的文本,是个累赘。在JavaFX8中,新增了一个TextFlow容器,可以向其中添加不同效果的Text,该容器会自动的对Text进行换行布局等,以及显示不同效果的文本。

本文将介绍一个为在JavaFX2版本中使用的显示两种颜色文本控件(局限性很大,只能分前后显示两种颜色,可以自动换行)。

代码

import javafx.event.EventHandler;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;

/**
 * 可以显示两种颜色的Label
 *
 * @since 2014-7-23 10:08:28
 * @author Alan
 */
public class TwoColorLabel extends TextArea {

    private static final Color DEFAULT_FIRST_COLOR = Color.RED;
    private static final Color DEFAULT_SECOND_COLOR = Color.rgb(76, 120, 174);

    public TwoColorLabel(final String firstText, final String secondText) {
        this(firstText, secondText, DEFAULT_FIRST_COLOR, DEFAULT_SECOND_COLOR);
    }

    public TwoColorLabel(final String firstText, final String secondText, final Color firstColor, final Color secondColor) {
        setText(firstText + secondText);
        setEditable(false);
        addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                t.consume();
            }
        });
        setWrapText(true);
        setStyle("-fx-text-fill:rgb(" + (int) (firstColor.getRed() * 255) + "," + (int) (firstColor.getGreen() * 255) + "," + (int) (firstColor.getBlue() * 255) + ");"
                + "-fx-highlight-fill: white;\n"
                + "-fx-highlight-text-fill:  rgb(" + (int) (secondColor.getRed() * 255) + "," + (int) (secondColor.getGreen() * 255) + "," + (int) (secondColor.getBlue() * 255) + ");"
                + "-fx-background-color: transparent;");
        selectRange(firstText.length(), getText().length());
    }
}

发表评论

邮箱地址不会被公开。 必填项已用*标注