J'ai besoin d'afficher un texte multiligne en lecture seule - quel contrôle peut-on utiliser pour cela? Il ne devrait afficher que le texte, comme le ferait une étiquette, mais cette dernière ne prend pas en charge la multiligne.
Merci pour tout indice :-)
Vous pouvez afficher du texte multiligne en lecture seule dans une Label
.
Si le texte contient des caractères \n
(nouvelle ligne), l'étiquette sera renvoyée à une nouvelle ligne, quel que soit le caractère de la nouvelle ligne.
Si le libellé de wrapText
est défini sur true et qu'il n'y a pas suffisamment d'espace pour afficher une seule ligne de texte, le libellé encapsule le texte sur une nouvelle ligne.
Si vous voulez du texte dans différents styles, si vous utilisez JavaFX 2, placez plusieurs étiquettes dans un FlowPane
ou, si vous utilisez Java 8+, placez les étiquettes dans un composant TextFlow
.
Produit par le code suivant:
import javafx.scene.Scene;
import javafx.application.Application;
import javafx.scene.control.Label;
import javafx.scene.image.*;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class LoveMeNot extends Application {
public static void main(String[] args) throws Exception { launch(args); }
@Override public void start(final Stage stage) throws Exception {
Label label = new Label(WORDS);
label.setWrapText(true);
label.setStyle("-fx-font-family: \"Comic Sans MS\"; -fx-font-size: 20; -fx-text-fill: darkred;");
ImageView image = new ImageView(IMAGE);
image.setOpacity(0.3);
StackPane layout = new StackPane();
layout.setStyle("-fx-background-color: mistyrose; -fx-padding: 10;");
layout.getChildren().setAll(image, label);
stage.setTitle("Love Me Not");
stage.setScene(new Scene(layout));
stage.show();
}
// creates a triangle.
private static final String WORDS =
"Love not me for comely grace,\n" +
"For my pleasing eye or face,\n" +
"Nor for any outward part,\n" +
"No, nor for my constant heart,\n" +
"For these may fail, or turn to ill.\n" +
"So thou and I must sever.\n" +
"Keep therefore a true woman’s eye,\n" +
"And love me still, but know not why,\n" +
"So hast thou the same reason still\n" +
"To doat upon me ever.";
private static final Image IMAGE =
new Image("http://icons.iconarchive.com/icons/artdesigner/gentle-romantic/256/rose-icon.png");
}
Essayez d'exécuter le programme ci-dessus et de redimensionner la fenêtre pour voir l'effet des valeurs de la nouvelle ligne \n
dans le texte de l'étiquette, ainsi que de la propriété wrapText
sur l'étiquette. Faites passer le paramètre wrapText
de true à faux pour voir la différence entre l'activation et la désactivation de wrapText
.
Si le texte contient des caractères\n (nouvelle ligne), l'étiquette placera le renvoi à la ligne sur une nouvelle ligne, où que se trouve le caractère de nouvelle ligne.
Cela ne fonctionne pas lorsque vous définissez du texte à partir d'un fichier FXML ainsi que de Visual FXML Editor.
Si vous définissez la largeur maximale souhaitée pour votre Label
, vous définissez setWrapText
sur true
pour qu'il affiche le texte en plusieurs lignes:
Label label = new Label("Your long text here");
label.setMaxWidth(180);
label.setWrapText(true);
Vous pouvez également utiliser Text
pour apparaître en plusieurs lignes en définissant wrappingWidthProperty
en fonction de vos besoins.
Text text = new Text();
text.wrappingWidthProperty().set(345);
Dans ce code, j'ai défini la largeur maximale sur 345.0
. Ainsi, lorsque la taille du texte dépasse 345
, les pixels sont renvoyés à la ligne suivante.
Classe de texte également disponible. Une bonne explication dans cette réponse label-and-text-differences-in-javafx Fondamentalement, utilisez Text pour les cas où vous ne recevez pas d’entrée, sinon Label est meilleur.