2013-04-12 15 views
28

Ich muss einen mehrzeiligen, schreibgeschützten Text anzeigen - welche Kontrolle kann dafür verwendet werden? Es sollte nur den Text ausgeben, wie ein Label, aber Label unterstützt keine Multiline?Steuerelement für mehrzeiligen Text anzeigen?

Dank für jeden Hinweis :-)

+1

Haben Sie sich das Steuerelement [TextArea] (http://docs.oracle.com/javafx/2/api/javafx/scene/control/TextArea.html) angesehen? Sie können es nicht editierbar machen und es so gestalten, dass es wie ein Etikett aussieht. – OttPrime

+0

Danke OttPrime, ja, das ist die Idee, der ich momentan folge. Dennoch frage ich mich, ob es keine wirkliche Kontrolle für die Anzeige von Text gibt? So etwas wie eine RichTextBox in .NET? –

+0

Der [HTMLEditor] (http://docs.oracle.com/javafx/2/ui_controls/editor.htm) ist am ehesten eine RichTextBox, aber es ist wahrscheinlich ein bisschen mehr Funktionalität als Sie wollen. – OttPrime

Antwort

44

Sie können in einer Label mehrzeiligen Nur-Lese-Text angezeigt werden soll.

Wenn der Text \n (Newline) -Zeichen enthält, wird die Beschriftung in eine neue Zeile umgebrochen, unabhängig davon, wo das Newline-Zeichen steht.

Wenn das Label auf true gesetzt hat und nicht genügend Platz zum Anzeigen einer einzelnen Textzeile vorhanden ist, wird das Etikett in eine neue Zeile eingefügt.


Wenn Sie Text in verschiedenen Stilen wollen, dann, wenn mit JavaFX 2, legen mehrere Etiketten in einem FlowPane oder, wenn Sie Java 8+ verwenden, legen Sie die Etiketten in einer TextFlow Komponente.


lovemenot

durch den folgenden Code Produziert:

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

Versuchen Sie das Programm ausführen und Ändern der Größe des Fensters, die Wirkung der \n neuen Linienwerte in der Beschriftung des Textes zu sehen, wie gut als wrapText -Eigenschaft auf dem Etikett. Variieren Sie die wrapText-Einstellung von "true" auf "false", um den Unterschied zwischen dem Ein- und Ausschalten von wrapText zu erkennen.

+14

Oh Gott, Comic Sans MS ist schrecklich. – RAnders00

+7

lol, wirklich rAnders, irgendwo umarmt mich Microsoft Bob und ein Schriftdesigner verflucht mich :-) – jewelsea

+0

alles über dein Beispielbild lässt mich zittern –

3

Sie legen eine maximale Breite, die Sie für Ihr Label wollen, dann setzen Sie wahr "setWrapText", so dass es den Text auf mehrzeilige Anzeige:

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

Wenn der Text \ n (Newline) Zeichen hat In diesem Fall platziert das Label den Zeilenumbruch an einer neuen Zeile, unabhängig davon, wo das Newline-Zeichen steht.

Es funktioniert nicht, wenn Sie Text aus FXML-Datei sowie Visual FXML-Editor festlegen.

+4

Da es "XML" ist, müssen Sie dies in FXML verwenden: Nicht sicher, wenn Scene Builder Sie dies tun lässt, müssen Sie möglicherweise die FXML direkt bearbeiten. – User

+0

@Manius Wo finde ich eine Liste von ' '? Ich habe versucht, 'FXML-Escape-Codes 'zu googeln, konnte aber keine Liste finden. Vielen Dank. – jpllosa

+0

Die Zahlen sind nur ASCII-Werte! http://www.asciitable.com/ (13 = zurück) :) Auch für einige Kontrollen (ich vergesse das, ein bisschen nach dem Ballmer Peak atm) Scene Builder hat einen "Multi-Line-Modus", den Sie aktivieren können in der UI, wenn Sie genau hinschauen. – User

3

Sie können auch Text verwenden in mehrzeiligen zu erscheinen, durch wrappingWidthProperty nach Ihren
Anwendungseinstellung.

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

In diesem Code habe ich max Breite auf 345,0 eingestellt, so dass, wenn die Größe des Textes über 345 Punkte erreicht werden nächste Zeile umgebrochen werden.

Verwandte Themen