2011-11-19 12 views
8

मेरे पास JList है जो बहुत लंबे आइटम नामों के साथ है जो क्षैतिज स्क्रॉल-बार स्क्रॉल-फलक में दिखाई देने का कारण बनता है।जेएलिस्ट वस्तुओं में शब्द लपेटें

क्या वैसे भी है कि मैं शब्द लपेट सकता हूं ताकि पूरे पंक्ति का नाम 2 पंक्तियों में दिखाई दे, फिर भी एक क्लिक में चुना जा सकता है? I.E इसे अभी भी व्यवहार करना चाहिए एक ही आइटम के रूप में, लेकिन दो पंक्तियों में प्रदर्शित किया जाना चाहिए।


यहाँ मैं मैं अपने प्रोजेक्ट MyCellRenderer को एक नया वर्ग जोड़ा नीचे

उदाहरण देखने के बाद क्या किया और उसके बाद मैं अपने सूची के पद सृजन कोड में MyList.setCellRenderer(new MyCellRenderer(80)); जोड़ा गया है। क्या वहां मेरे कुछ और करने की आवश्यकता है?

+4

कस्टम सेल रेंडरर का उपयोग करें। –

+0

मुझे ऐसा कुछ हल करने के लिए जेएलएबल, एचटीएमएल और सरल स्टाइल शीट का उपयोग करके किसी को याद किया गया था (यह एंड्रयू था)। –

+0

हां, ज़ाहिर है, यह एंड्रयू था: [कुछ-शब्द-लपेट-संपत्ति-का-जेलाबेल मौजूद है] (http://stackoverflow.com/questions/7861724/is-there-some-word- रेप-संपत्ति के- JLabel-अस्तित्व/7861833 # 7861833)। मुझे विश्वास है कि इस अवधारणा का उपयोग आपके कस्टम सेल रेंडरर में भी किया जा सकता है। –

उत्तर

19

हाँ, एंड्रयू कोड का उपयोग कर, मैं कुछ इस तरह के साथ आया था:

import java.awt.Component; 
import javax.swing.*; 

public class JListLimitWidth { 
    public static void main(String[] args) { 
     String[] names = { "John Smith", "engelbert humperdinck", 
      "john jacob jingleheimer schmidt" }; 
     MyCellRenderer cellRenderer = new MyCellRenderer(80); 
     JList list = new JList(names); 
     list.setCellRenderer(cellRenderer); 
     JScrollPane sPane = new JScrollPane(list); 
     JPanel panel = new JPanel(); 
     panel.add(sPane); 
     JOptionPane.showMessageDialog(null, panel); 

    } 
} 

class MyCellRenderer extends DefaultListCellRenderer { 
    public static final String HTML_1 = "<html><body style='width: "; 
    public static final String HTML_2 = "px'>"; 
    public static final String HTML_3 = "</html>"; 
    private int width; 

    public MyCellRenderer(int width) { 
     this.width = width; 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
     String text = HTML_1 + String.valueOf(width) + HTML_2 + value.toString() 
      + HTML_3; 
     return super.getListCellRendererComponent(list, text, index, isSelected, 
      cellHasFocus); 
    } 

} 
+1

+1 हम्मम्म कितना आसान – mKorbel

+2

यह मेरे स्मारक नहीं थे जिन्होंने यह किया लेकिन यह यहां एक है: [एंड्रयू का पोस्ट] (http://stackoverflow.com/questions/7861724/is-there-some-word-wrap-property- की-JLabel-अस्तित्व/7861833 # 7861833)। मैं एक बार से अधिक बार अपने उत्तर को ऊपर नहीं उठा सकता, लेकिन मैं किसी को भी प्रोत्साहित करता हूं जो सोचता है कि मेरा जवाब लिंक को ऊपर उठाने में सहायक था। –

+0

बढ़िया! मेरा सुझाव है कि हम दोनों को ऊपर उठाओ! –

-1

तुम भी गतिशील रूप से (एक निश्चित मूल्य के बजाय) चौड़ाई की गणना कर सकते हैं:

String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3; 

तो अगर पैनल सूची का आकार बदलता है, रैपिंग सही रहता है।

अद्यतन

और परिणाम इस प्रकार है: enter image description here

+0

यह काम नहीं करता है। यदि जेएलआईस्ट का आकार बदलता है तो पंक्ति की ऊंचाई समायोजित नहीं की जाएगी और मजेदार दृश्य चीजें होती हैं। मेरी संलग्न छवि देखें ... मैंने चित्रण में मदद करने के लिए हरा और लाल जोड़ा। – Jason

0

यह और भी आसान किया जा सकता है। आप ListModel के साथ consatructor द्वारा जेएलिस्ट बना सकते हैं। CustomListModel में सारसूचीसूची को बढ़ाता है, getElementAt() विधि समान HTML-स्वरूपित पाठ के साथ स्ट्रिंग लौटा सकती है। तो इस तरह सेल रेंडरर संशोधन के बिना ऐसा ही करते हैं।

+2

रैपिंग यूआई है और मॉडल से संबंधित नहीं है। यूआई को समायोजित करने के लिए मॉडल को बदलना बुरा है। – SurfMan

संबंधित मुद्दे