2012-04-01 6 views
7

में काम नहीं करता है जब ListView-Cell में WordWrap को सक्रिय करते समय पाठ लपेट नहीं रहा है। यहाँ एक उदाहरण है:जावाएफएक्स: setWrapText (true) (WordWrap) ListView

public class ListBug extends Application { 

public static void main(String[] args) { 
    launch(args); 
} 

@Override 
public void start(Stage primaryStage) { 
    ListView<String> myList = new ListView<String>(); 

    myList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { 

     @Override 
     public ListCell<String> call(ListView<String> param) { 
      return new ListCell<String>() { 
       @Override 
       public void updateItem(String item, boolean empty) { 
        setWrapText(true); 
        setText(item); 
        super.updateItem(item, empty); 
       } 
      }; 
     } 
    }); 

    for (int i = 0; i < 100; i++) { 
     myList.getItems() 
       .add("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
         + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
         + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
         + "nisi ut aliquip ex ea commodo consequat."); 
    } 
    primaryStage.setScene(new Scene(myList)); 
    primaryStage.setTitle("ListWrapBug"); 
    primaryStage.show(); 
} 

}

आम तौर पर कोशिकाओं में पाठ लपेट चाहिए लेकिन पूरे पाठ एक पंक्ति में है एक एक क्षैतिज स्क्रॉलबार दिखाया गया है।

मैं सूची कक्ष में वर्डवाप का उपयोग कैसे कर सकता हूं या यह जावाएफएक्स बग है ?? ListCell में एक बग की तरह

+0

क्या आपने 'super.updateItem (आइटम, खाली) डालने का प्रयास किया है; पहले? – assylias

+0

वही प्रभाव ... –

उत्तर

2

देखो, एक समाधान के रूप में आप ListView<Text> बजाय का उपयोग कर सकते हैं:

ListView<Text> myList = new ListView<Text>(); 

    for (int i = 0; i < 100; i++) { 
     myList.getItems().add(TextBuilder.create().text("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
       + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
       + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
       + "nisi ut aliquip ex ea commodo consequat.").wrappingWidth(200).build()); 
    } 

    myList.setPrefWidth(200); 
    primaryStage.setScene(new Scene(myList)); 
    primaryStage.setTitle("ListWrapBug"); 
    primaryStage.show(); 

आप आकार बदलने योग्य सूची आप बंधन का उपयोग कर सकते हैं:

ListView<Text> myList = new ListView<Text>(); 

    for (int i = 0; i < 100; i++) { 
     Text text = new Text("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
       + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
       + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
       + "nisi ut aliquip ex ea commodo consequat."); 
     text.wrappingWidthProperty().bind(myList.widthProperty()); 
     myList.getItems().add(text); 
    } 
+0

अच्छा विचार लेकिन मेरे लिए काम नहीं करता है। मुझे एक गतिशील लपेटना चाहिए। यदि मैं सूची को चौड़ाई = 100 में बदलता हूं तो लपेटें अभी भी चौड़ाई 200 पर है। मुझे लगता है कि [सामग्री पूर्वाग्रह] (http://amyfowlersblog.wordpress.com/2011/06/02/javafx2-0-layout-a- क्लास-टूर /) एक सूची दृश्य के अंदर काम नहीं करता है। –

+0

आप सूची चौड़ाई के लिए चौड़ाई लपेट सकते हैं। मैंने एक उदाहरण के साथ जवाब अद्यतन किया है। –

+0

बेहतर दिखता है लेकिन अंतिम पिक्सेल दाएं स्क्रॉलबार से छिपा हुआ है और नीचे स्क्रॉलबार अभी भी वहां है। नीचे स्क्रॉलबार का एक अजीब व्यवहार है। मैं एक वीडियो अपलोड करूंगा ... –

7

बिल्कुल एक ही समस्या थी। यहां वह कोड है जो मेरे लिए काम करता है।

public class ListBug extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     ListView<String> myList = new ListView<String>(); 
     myList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { 
      @Override 
      public ListCell<String> call(final ListView<String> list) { 
       return new ListCell<String>() { 
        { 
         Text text = new Text(); 
         text.wrappingWidthProperty().bind(list.widthProperty().subtract(15)); 
         text.textProperty().bind(itemProperty()); 

         setPrefWidth(0); 
         setGraphic(text); 
        } 
       }; 
      } 
     }); 

     for (int i = 0; i < 100; i++) { 
      myList.getItems() 
        .add("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
          + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
          + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
          + "nisi ut aliquip ex ea commodo consequat."); 
     } 
     primaryStage.setScene(new Scene(myList)); 
     primaryStage.setTitle("ListWrapBug"); 
     primaryStage.show(); 
    } 
} 
+0

कोड का बड़ा टुकड़ा, @Gleb, केवल एक ही मुद्दे के साथ: 'text.textProperty()। बाइंड (itemProperty()) 'काम नहीं किया और मुझे बस' text.setText (आइटम) का उपयोग करना पड़ा; ' – ajeh