2013-04-12 10 views
28

Ho bisogno di visualizzare un testo di sola lettura multilinea - quale controllo può essere usato per quello? Dovrebbe solo dislay il testo, come fa un'etichetta, tuttavia Label non supporta multilinea?Controllo per la visualizzazione di testo multilinea?

Grazie per qualsiasi suggerimento :-)

+1

Hai controllato il controllo [TextArea] (http://docs.oracle.com/javafx/2/api/javafx/scene/control/TextArea.html)? Puoi renderlo non modificabile e modificarlo per sembrare un'etichetta. – OttPrime

+0

Grazie OttPrime, sì, questa è l'idea che sto seguendo attualmente. Mi chiedo ancora se non ci sia un vero controllo per la visualizzazione del testo? Qualcosa come un RichTextBox in .NET? –

+0

The [HTMLEditor] (http://docs.oracle.com/javafx/2/ui_controls/editor.htm) è il più vicino a un RichTextBox ma probabilmente è un po 'più funzionale di quello che stai cercando. – OttPrime

risposta

44

È possibile visualizzare più righe di sola lettura il testo in un Label.

Se il testo contiene caratteri \n (di nuova riga), l'etichetta si posizionerà su una nuova riga ovunque sia il carattere di nuova riga.

Se l'etichetta haimpostato su true e non c'è abbastanza spazio per visualizzare una singola riga di testo, l'etichetta avvolgerà il testo in una nuova riga.


Se si desidera che il testo in stili diversi, quindi, se si utilizza JavaFX 2, inserire più etichette in un FlowPane o, se si utilizza Java 8+, posizionare le etichette in un componente TextFlow.


lovemenot

Prodotto dal seguente codice:

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"); 
} 

Provare a eseguire il programma di cui sopra e il ridimensionamento della finestra per vedere l'effetto dei \n nuovi valori di riga nel testo dell'etichetta pure come la proprietà wrapText sull'etichetta. Modifica l'impostazione wrapText da true a false per vedere la differenza tra avere wrapText attivato e disattivato.

+14

Oh dio, Comic Sans MS è orribile. – RAnders00

+7

lol, veramente rAnders, da qualche parte Microsoft Bob mi sta abbracciando e un designer di font mi sta maledicendo :-) – jewelsea

+0

tutto ciò che riguarda l'immagine di esempio mi fa rabbrividire –

3

si imposta una larghezza massima che si desidera per l'etichetta, poi si mette fedele alla "setWrapText" in modo da visualizzare il testo su più righe:

Label label = new Label("Your long text here"); 
label.setMaxWidth(180); 
label.setWrapText(true); 
5

Se il testo ha caratteri (nuova riga) \ n al suo interno, l'etichetta posizionerà l'involucro su una nuova riga ovunque sia il carattere di nuova riga.

Non funziona quando si imposta il testo dal file FXML e dall'editor FXML visivo.

+4

Poiché si tratta di "XML", è necessario utilizzarlo in FXML: Non sono sicuro che se Scene Builder consente di farlo, potrebbe essere necessario modificare direttamente il file FXML. – User

+0

@Manius Dove posso trovare un elenco di ' '? Ho provato a cercare i codici di escape FXML ma non ho trovato nessun elenco. Grazie. – jpllosa

+0

I numeri sono solo valori ASCII! http://www.asciitable.com/ (13 = ritorno) :) Inoltre, per alcuni controlli (non ricordo quale, un po 'oltre il Ballmer Peak atm) Scene Builder ha una "modalità multi linea" che è possibile abilitare nell'interfaccia utente se si guarda attentamente. – User

3

È inoltre possibile utilizzare Text ad apparire in multilinea, impostando wrappingWidthProperty secondo la vostra
applicazione.

Text text = new Text(); 
    text.wrappingWidthProperty().set(345); 

In questo codice, ho impostare la larghezza massima di 345,0, in modo che quando le dimensioni del testo raggiunge oltre 345 pixel saranno spostati alla riga successiva.