我为JavaFX 8创建了一个自定义颜色选择器控件。它由Slider
中的六个GridPane
组成,其上方各有Label
s。
<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>
现在,当我缩小选择器时,标签的文本会溢出。
我希望在这里发生的是文本将更改为他们的第一个字母R
,G
,B
,H
,S
,L
,而不是带有省略号的剪辑版本。
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
?
答案 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;
}
}