JavaFX:如何在按钮中显示富文本?

时间:2017-12-18 23:33:16

标签: java javafx javafx-8

在JavaFX-8 中(编辑:我意识到我使用jdk-9.0.1,可能会有所不同?),我想要一个组件Button的功能,但其标签可以设置为富文本。到目前为止,我已经尝试过:

  1. 单独使用TextFlow和其他组件(Pane,StackPane) 和CSS样式添加背景颜色和边框。这没用 因为我无法将文本垂直居中 当我设置组件的首选宽度和高度时,组件。

  2. 与上述相同,但使用垂直填充来使文本居中。这不起作用,因为我无法设置按钮的高度。如果我设置文本将包装的最大宽度,但在包装时,因为填充是恒定大小,组件的整体高度将增加而不是文本只是占用更多空间或被剪裁以适合(并附加&# 34; ......"喜欢按钮)。

  3. 没有文本的按钮,并使用其setGraphic方法将其图形节点设置为我选择的TextFlow。这不起作用,因为TextFlow没有被剪裁以适合按钮。相反,如果它很大,它将显示在按钮的边框之外。 编辑: 似乎也无法垂直居中。这仅在Button具有文本和图形时才会完成,但它不会换行。

  4. 我还注意到Button确实有一个TextFlow子项,但不幸的是我似乎无法设置它,因为我只能使用Button的getChildrenUnmodifiable方法返回它。

    < / LI>

    还有其他方法可以实现这一目标,还是有一些合理的方法来制定我已经尝试过的方法之一?

    总结一下,我需要一些重要的事情:

    • 能够像按钮一样使用组件。
    • 在组件中显示富文本(可选垂直居中)。
    • 轻松设置和更改富文本或部分内容。
    • 允许在不再适合的情况下剪切富文本。
    • 以某种方式设置组件大小,以便在文本变大时不会调整大小。

    每个请求,一个MCVE,其中#3对我不起作用:

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Text;
    import javafx.scene.text.TextFlow;
    import javafx.stage.Stage;
    
    public class TestWindow extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            VBox mainLayout = new VBox();
    
            Text t = new Text(
                    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis blandit dolor non dui porttitor, sit amet commodo ipsum condimentum. Proin quis tincidunt massa.");
            TextFlow a = new TextFlow(t);
            a.setTextAlignment(TextAlignment.CENTER);
    
            Button b = new Button();
            b.setGraphic(a);
            b.setAlignment(Pos.CENTER);
            b.setPrefSize(300, 100);
    
            mainLayout.getChildren().addAll(b);
    
            Scene scene = new Scene(mainLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
    }
    

    此代码产生以下结果

    When running the program

    After resizing window

    如果按钮有一些文本,例如它是用单个空格创建的

    Button b = new Button(" ");
    

    The text does not wrap at all

1 个答案:

答案 0 :(得分:0)

部分解决方案

我无法找到一种解决方案,既可以将文本居中,也可以在文本太大的情况下剪切文本。目前,我的解决方法是仅将文本居中。

通过将其maxHeight设置为较小的值,可以垂直居中TextFlow。在问题中使用MCVE作为#3,添加a.setMaxHeight(0);就足够了。这将使文本居中,因为TextFlow将不再展开以占用所有可用空间。