Issue
I'm using JavaFX to build a program wherein I need to display lines of text one after the other. Similarly to a messaging app such as WhatsApp, I need to align some lines of text to the right and others to the left, like this:
I first tried to use a TextArea, but I was only able to align all of the text towards one direction or the other. Additionally, it's a pain to add and remove text from a TextArea on the fly.
This led me to attempt to use a TextFlow instead, which makes use of Text nodes that I can control the individual attributes of, as well as add and remove as needed. While using the TextFlow however, I was still unable to align the nodes to the right of the Flow's area. I tried to use both the setStyle() and setTextAlignment() methods, to no avail.
TL,DR: How can I control the attributes of Text nodes within a JavaFX TextFlow such that some nodes are aligned to the right, while others are aligned to the left?
Many thanks
Solution
There are several alternatives to achieve this. One approach would be to use a VBox
for the layout, and a Label
wrapped in an HBox
for the text:
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);
StackPane root = new new StackPane(pane);
root.setPrefSize(300, 300);
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();
}
}
Output:
Answered By - Oboe