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

JavaFX:如何在按钮中显示富文本?,java,javafx,javafx-8,Java,Javafx,Javafx 8,在JavaFX-8中(Edit:我意识到我使用的是jdk-9.0.1,可能有什么不同?),我想要一个具有按钮功能的组件,但其标签可以设置为富文本。到目前为止,我已经尝试: 单独使用TextFlow和其他组件(窗格、堆栈窗格) 和CSS样式添加背景色和边框。这不起作用 因为我无法使文本在视图中垂直居中 当我设置了组件的首选宽度和高度时 同上,但使用垂直填充将文本居中。这不起作用,因为我无法设置按钮的高度。如果我设置了一个最大宽度,文本将进行换行,但在换行时,由于填充的大小是恒定的,因此组件的总体高

在JavaFX-8中(Edit:我意识到我使用的是jdk-9.0.1,可能有什么不同?),我想要一个具有按钮功能的组件,但其标签可以设置为富文本。到目前为止,我已经尝试:

  • 单独使用TextFlow和其他组件(窗格、堆栈窗格) 和CSS样式添加背景色和边框。这不起作用 因为我无法使文本在视图中垂直居中 当我设置了组件的首选宽度和高度时

  • 同上,但使用垂直填充将文本居中。这不起作用,因为我无法设置按钮的高度。如果我设置了一个最大宽度,文本将进行换行,但在换行时,由于填充的大小是恒定的,因此组件的总体高度将增加,而不是简单地占用更多空间或进行剪裁以适应(并像按钮中那样附加“…”)

  • 没有文本的按钮,并使用其setGraphic方法将其图形节点设置为我选择的文本流。这不起作用,因为文本流没有剪裁到适合按钮的位置。相反,如果它太大,则会显示在按钮边框之外编辑:似乎也无法将图形垂直居中。只有当按钮包含文本和图形时,才可以执行此操作,但它不会换行

  • 我还注意到按钮确实有TextFlow子级,但不幸的是,我似乎无法设置它,因为我只能使用按钮的getChildrenUnmodifiable方法返回它

  • 是否有其他方法来实现这一点,或者是否有合理的方法来实现我已经尝试过的方法之一

    总而言之,我需要一些重要的东西:

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

    根据请求,3不适合我的MCVE:

    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();
        }
    
    }
    
    此代码生成以下结果

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

    Button b = new Button(" ");
    

    部分溶液

    我还没有找到一个解决方案,既可以居中的文字和剪辑,如果它太大。目前,我的解决方法是只将文本居中


    通过将文本流的最大高度设置为较小的值,可以使文本流垂直居中。将MCVE用于问题中的#3,添加
    a.setMaxHeight(0)就足够了。这将使文本居中,因为文本流将不再扩展以占用所有可用空间。

    将按钮的图形设置为文本流应该可以工作。发布一篇关于你的尝试的文章。@James_D经过编辑,包括MVCE和我看到的图片。我根本无法复制使图形垂直居中的效果,所以我以前可能弄错了。这意味着这个选项的效果甚至更低。我还意识到我实际上在使用jdk-9.0.1,也许这会有所不同?我已经用我的编辑更新了帖子。