web-dev-qa-db-fra.com

Contrôle pour l'affichage de texte multiligne?

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 :-)

35
stefan.at.wpf

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 .


lovemenot

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.

57
jewelsea

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.

6
Steel Rat

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);
4
Issam El omri

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.

3
guru_001

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.

0
SystemsInCode