如何在 JavaFX 中将某些文本行右对齐?
How do I align certain lines of text to the right in JavaFX?
我正在使用 JavaFX 构建一个程序,其中我需要逐行显示文本行。类似于 WhatsApp 之类的消息传递应用程序,我需要将一些文本行右对齐,而另一些文本行左对齐,如下所示:
我第一次尝试使用 TextArea,但我只能将所有文本对齐到一个方向或另一个方向。此外,动态地在 TextArea 中添加和删除文本是一件很痛苦的事情。
这促使我尝试改用 TextFlow,它利用我可以控制其各个属性以及根据需要添加和删除的文本节点。然而,在使用 TextFlow 时,我仍然无法将节点对齐到 Flow 区域的右侧。
我尝试同时使用 setStyle() 和 setTextAlignment() 方法,但无济于事。
TL,DR:如何控制 JavaFX TextFlow 中文本节点的属性,使一些节点右对齐,而其他节点左对齐?
非常感谢
有几种方法可以实现这一点。一种方法是使用 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();
}
}
输出:
我正在使用 JavaFX 构建一个程序,其中我需要逐行显示文本行。类似于 WhatsApp 之类的消息传递应用程序,我需要将一些文本行右对齐,而另一些文本行左对齐,如下所示:
我第一次尝试使用 TextArea,但我只能将所有文本对齐到一个方向或另一个方向。此外,动态地在 TextArea 中添加和删除文本是一件很痛苦的事情。
这促使我尝试改用 TextFlow,它利用我可以控制其各个属性以及根据需要添加和删除的文本节点。然而,在使用 TextFlow 时,我仍然无法将节点对齐到 Flow 区域的右侧。 我尝试同时使用 setStyle() 和 setTextAlignment() 方法,但无济于事。
TL,DR:如何控制 JavaFX TextFlow 中文本节点的属性,使一些节点右对齐,而其他节点左对齐?
非常感谢
有几种方法可以实现这一点。一种方法是使用 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();
}
}
输出: