【问题标题】:How do I align certain lines of text to the right in JavaFX?如何在 JavaFX 中将某些文本行向右对齐?
【发布时间】:2021-11-19 03:50:38
【问题描述】:

我正在使用 JavaFX 构建一个程序,其中我需要一个接一个地显示文本行。与 WhatsApp 等消息传递应用程序类似,我需要将一些文本行向右对齐,而将其他文本行向左对齐,如下所示:

我第一次尝试使用 TextArea,但我只能将所有文本对齐到一个方向或另一个方向。此外,动态地在 TextArea 中添加和删除文本是一件很痛苦的事情。

这导致我尝试改用 TextFlow,它利用 Text 节点,我可以控制其各个属性,以及根据需要添加和删除。然而,在使用 TextFlow 时,我仍然无法将节点对齐到 Flow 区域的右侧。 我尝试同时使用 setStyle() 和 setTextAlignment() 方法,但无济于事。

TL,DR:如何控制 JavaFX TextFlow 中 Text 节点的属性,以使某些节点向右对齐,而其他节点向左对齐?

非常感谢

【问题讨论】:

  • GridPane 听起来是您的完美布局管理器。您可以将右对齐的框偏移一列或多列以满足您的需要。有关 GridPane 的信息,请参见此处:docs.oracle.com/javafx/2/api/javafx/scene/layout/GridPane.html 或者使用 Flow 布局,您可能需要将文本包装在另一个组件中,该组件可以正确对齐文本并在左/右大小上使用一些填充。
  • 如果文本序列确实是像 WhatsApp 这样的对话,那么我将使用 ListView 和自定义 ListCell 实现,根据需要对齐文本组。每条单独的消息都将是ListView 中自己的项目。
  • 这能回答你的问题吗? JavaFx ListView for chat application

标签: java user-interface javafx


【解决方案1】:

有几种方法可以实现这一点。一种方法是使用VBox 进行布局,将Label 包裹在HBox 中作为文本:

public class App extends Application {

    @Override
    public void start(Stage stage) {

        VBox pane = new VBox();
    
        pane.setPrefWidth(300);
        pane.setSpacing(10);
        pane.setAlignment(Pos.BOTTOM_CENTER);
        pane.setPadding(new Insets(20, 10, 20, 10));
    
        HBox text1 = createText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.", true);
        HBox text2 = createText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vel quam erat.", false);
    
        pane.getChildren().setAll(text1, text2);

        Scene scene = new Scene(new StackPane(pane));

        stage.setScene(scene);
        stage.show();
    }

    private static HBox createText(String text, boolean right) {
        Label label = new Label(text);
        label.setWrapText(true);
        label.setMinWidth(200);
        label.setPrefWidth(200);
        label.setMaxWidth(200);
        label.setPadding(new Insets(5));
        label.setStyle("-fx-background-color: " + (right ? "#DCF8C6;" : "white;") + "-fx-background-radius: 10;");
        HBox pane = new HBox(label);
        pane.setAlignment(right ? Pos.CENTER_RIGHT : Pos.CENTER_LEFT);
        return pane;
    }

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

}

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多