为Label定义自定义溢出样式

时间:2016-07-17 14:35:28

标签: java javafx label javafx-8

我为JavaFX 8创建了一个自定义颜色选择器控件。它由Slider中的六个GridPane组成,其上方各有Labels

<GridPane vgap="10" hgap="10">
    <Label labelFor="${redSlider}" text="Red"
           GridPane.rowIndex="0" GridPane.columnIndex="0" GridPane.halignment="CENTER"/>
    <!-- 5 more labels -->
    <Slider max="255" orientation="VERTICAL" fx:id="redSlider" id="redSlider"
            GridPane.rowIndex="1" GridPane.columnIndex="0" GridPane.vgrow="ALWAYS"
            GridPane.hgrow="ALWAYS" GridPane.halignment="CENTER"/>
    <!-- 5 more Sliders -->
</GridPane>

color picker

现在,当我缩小选择器时,标签的文本会溢出。

narrowed color picker

我希望在这里发生的是文本将更改为他们的第一个字母RGBHSL,而不是带有省略号的剪辑版本。

Label的{​​{3}}属性允许将溢出模式设置为textOverrun中定义的七个值,但这些都不符合我要查找的内容。

查看Label类,显示的文本由OverrunStyle计算。在我的JDK中,这直接转到com.sun.javafx.scene.control.skin.LabeledSkinBase.updateDisplayedText(),然后调用com.sun.javafx.scene.control.skin.Utils.computeClippedText()。通过扩展Label实际上没有简单的方法来修改这些东西,因为它是不可移植的;我们必须重新实现整个Skin,这基本上是Label UI的完整实现。

是否有便携式方式使Label s文本在溢出时与单个字符签约而不是实现自己的Skin

更新:我将Skin@VGR实施为可重复使用的类。你可以在这里得到它:answer

2 个答案:

答案 0 :(得分:2)

这不是你要求的 - 使用OverrunStyle来实现你的目标 - 但它确实产生了同样的效果:

$(window).on('load', function(){
    console.log('Header loaded');
  });

答案 1 :(得分:1)

希望这会有所帮助(但需要一些改进)

import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.SkinBase;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Test extends javafx.application.Application {

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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Test");

        HBox root = new HBox();

        root.getChildren().add(getLabel("Aaaaa"));
        root.getChildren().add(getLabel("Bbbbbbbbb"));
        root.getChildren().add(getLabel("Cccccccccccccccccc"));
        root.getChildren().add(getLabel("Ddddddddddddd"));
        root.getChildren().add(getLabel("Eeeeeeeeee"));
        root.getChildren().add(getLabel("Fffff"));

        primaryStage.setScene(new Scene(root, 500, 250));
        primaryStage.show();
    }

    private StackPane getLabel(String text) {

        final Label label = new Label(text);
        final Label gLabel = new Label(text.substring(0, 1));

        // should run after label become visible
        Platform.runLater(() -> {
            for(Node node : ((SkinBase<Label>)label.getSkin()).getChildren()) {
                if(node instanceof Text) {
                    ((Text)node).textProperty().addListener((e, o, n) -> {
                        gLabel.setVisible(!label.getText().equals(n));
                        label.setVisible(!gLabel.isVisible());
                    });
                }
            }
        });

        gLabel.setStyle("-fx-border-color: red");
        gLabel.setVisible(false);

        StackPane pane = new StackPane(label, gLabel);

        return pane;

    }

}