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

问题描述 投票:2回答:1

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

  1. 单独使用TextFlow和其他组件(Pane,StackPane)和CSS样式来添加背景颜色和边框。这不起作用,因为当我设置组件的首选宽度和高度时,我无法使文本在组件中垂直居中。
  2. 与上面相同,但使用垂直填充来使文本居中。这不起作用,因为我无法设置按钮的高度。如果我设置文本将包装的最大宽度,但在包装时,因为填充是恒定大小,组件的整体高度将增加而不是文本只是占用更多空间或被剪裁以适合(并附加“。 ..“喜欢在按钮中)。
  3. 一个没有文本的按钮,并使用其setGraphic方法将其图形节点设置为我选择的TextFlow。这不起作用,因为TextFlow没有被剪裁以适合按钮。相反,如果它很大,它将显示在按钮的边框之外。编辑:似乎也不可能垂直居中图形。仅当Button具有文本和图形时才会执行此操作,但之后它不会换行。
  4. 我也注意到一个Button确实有一个TextFlow子,但不幸的是我似乎无法设置它,因为我只能使用Button的getChildrenUnmodifiable方法返回它。

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

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

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

每个请求,一个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

java javafx javafx-8
1个回答
0
投票

部分解决方案

我一直无法找到一种解决方案,它既可以使文本居中,也可以在文本过大时将其剪切。目前,我的解决方法是仅将文本居中。

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

© www.soinside.com 2019 - 2024. All rights reserved.