2013-04-12 44 views
28

Tôi cần hiển thị văn bản nhiều dòng, chỉ đọc - kiểm soát nào có thể được sử dụng cho điều đó? Nó chỉ nên xóa các văn bản, giống như một Label, tuy nhiên Label không hỗ trợ multiline?Kiểm soát hiển thị văn bản nhiều dòng?

Thanks cho bất kỳ gợi ý :-)

+1

Bạn có nhìn vào điều khiển [TextArea] (http://docs.oracle.com/javafx/2/api/javafx/scene/control/TextArea.html) không? Bạn có thể làm cho nó không thể chỉnh sửa và tạo kiểu cho nó trông giống như một nhãn. – OttPrime

+0

Cảm ơn bạn OttPrime, vâng, đó là ý tưởng tôi hiện đang theo dõi. Tôi vẫn tự hỏi nếu không có kiểm soát thực sự để hiển thị văn bản? Một cái gì đó giống như RichTextBox trong .NET? –

+0

[HTMLEditor] (http://docs.oracle.com/javafx/2/ui_controls/editor.htm) là gần nhất bạn sẽ nhận được một RichTextBox nhưng nó có thể là một chút chức năng hơn bạn đang sau. – OttPrime

Trả lời

44

Bạn có thể hiển thị nhiều dòng read-only văn bản trong một Label.

Nếu văn bản có các ký tự \n (dòng mới) trong đó, nhãn sẽ được bao bọc thành một dòng mới ở bất kỳ ký tự dòng mới nào.

Nếu nhãn có wrapText được đặt thành true và không có đủ không gian để hiển thị một dòng văn bản, thì nhãn sẽ bao bọc văn bản thành dòng mới.


Nếu bạn muốn văn bản trong phong cách khác nhau, sau đó, nếu sử dụng JavaFX 2, đặt nhiều nhãn trong một FlowPane hoặc, nếu bạn đang sử dụng Java 8+, đặt nhãn trong một thành phần TextFlow.


lovemenot

Được sản xuất bởi đoạn mã sau:

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

Thử chạy chương trình ở trên và thay đổi kích thước cửa sổ để xem ảnh hưởng của \n giá trị dòng mới trong văn bản của nhãn cũng như thuộc tính wrapText trên nhãn. Thay đổi cài đặt wrapText từ true thành false để thấy sự khác biệt giữa việc bật và tắt wrapText.

+14

Trời ơi, Comic Sans MS thật khủng khiếp. – RAnders00

+7

lol, thực sự rAnders, một nơi nào đó Microsoft Bob đang ôm tôi và một nhà thiết kế phông chữ đang nguyền rủa tôi :-) – jewelsea

+0

mọi thứ về hình ảnh mẫu của bạn khiến tôi rùng mình –

-2

Lớp văn bản cũng có sẵn. Một lời giải thích tốt trong câu trả lời này label-and-text-differences-in-javafx Về cơ bản, sử dụng Văn bản cho nơi bạn không nhận được dữ liệu đầu vào, nếu không thì Nhãn là tốt hơn.

3

Bạn thiết lập chiều rộng tối đa bạn muốn cho nhãn của bạn, sau đó bạn đặt đúng để "setWrapText" để nó hiển thị dòng chữ trên nhiều dòng:

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

Nếu văn bản có \ n ký tự (newline) trong đó, nhãn sẽ đặt vào một dòng mới ở bất kỳ nơi nào có ký tự dòng mới.

Nó không hoạt động khi bạn đặt văn bản từ tệp FXML cũng như từ trình chỉnh sửa FXML trực quan.

+4

Vì đó là "XML", bạn phải sử dụng điều này trong FXML: Không chắc liệu Trình tạo cảnh có cho phép bạn thực hiện điều đó hay không, có thể cần chỉnh sửa trực tiếp FXML. – User

+0

@Manius Tôi có thể tìm danh sách ' 'ở đâu? Đã cố gắng googling 'mã thoát FXML' nhưng không thể tìm thấy bất kỳ danh sách nào. Cảm ơn. – jpllosa

+0

Các con số chỉ là giá trị ASCII! http://www.asciitable.com/ (13 = return) :) Ngoài ra, đối với một số điều khiển (tôi quên điều đó, một chút quá khứ Ballmer Peak atm) Scene Builder có một "chế độ đa dòng" mà bạn có thể kích hoạt trong giao diện người dùng nếu bạn nhìn kỹ. – User

3

Bạn cũng có thể sử dụng Text để xuất hiện trong nhiều dòng, bằng cách đặt wrappingWidthProperty theo ứng dụng
của bạn.

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

Trong mã này, tôi đã thiết lập chiều rộng tối đa đến 345,0, Vì vậy, Khi kích thước của văn bản đạt vượt 345 điểm ảnh sẽ được bao bọc để dòng tiếp theo.

Các vấn đề liên quan