2009-12-03 7 views
19

मैं टेक्स्ट की कई पंक्तियों के साथ एक स्विंग जेलाबेल बनाने की कोशिश कर रहा हूं। यह ठीक है, लेकिन लाइन ब्रेक के माध्यम से नहीं आते हैं। मैं यह कैसे करु? वैकल्पिक रूप से, क्या मैं सिर्फ जेएलएबल के लिए अधिकतम चौड़ाई निर्दिष्ट कर सकता हूं और जानता हूं कि पाठ एक div में की तरह लपेट जाएगा?जावा: जेएलबेल में लाइनब्रैक?

private void addLegend() { 
     JPanel comparisonPanel = getComparisonPanel(); 

     //this all displays on one line 
     JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\n"); 

     comparisonPanel.add(legend);   
    } 

उत्तर

37

सेटटेक्स्ट में HTML का उपयोग करें, उदा।

myLabel.setText("<html><body>with<br>linebreak</body></html>"); 
+2

या आप इसे और अधिक गतिशील है, तो आप चौड़ाई सीएसएस या चौड़ाई विशेषता एचटीएमएल अंदर उपयोग कर सकते हैं चाहते हैं, [यहां] (http://stackoverflow.com/questions/2420742/make-a-jlabel देखना -प्रैप-इसकी-पाठ-दर-सेटिंग-ए-अधिकतम-चौड़ाई/3194997 # 3194997) –

6

आप एचटीएमएल को जेएलएबल के अंदर रख सकते हैं और इसे प्राप्त करने के लिए लाइनबैक टैग का उपयोग कर सकते हैं।

9

डिफ़ॉल्ट रूप से, स्विंग टेक्स्ट लपेटता नहीं है। यदि आप जेएलएबल पर एक आकार निर्दिष्ट करते हैं तो यह केवल उस पाठ का हिस्सा पेंट करेगा जो फिट बैठता है और फिर अंत में "..." जोड़ता है।

जैसा कि सुझाव दिया गया है कि आप लाइन रैपिंग सक्षम करने के लिए HTML का उपयोग कर सकते हैं। हालांकि, मैंने वास्तव में इसे प्राप्त करने के लिए बहुत पहले एक कस्टम स्विंग यूआई प्रतिनिधि बनाया है और इससे भी अधिक: MultiLineLabelUI

यह आपके टेक्स्ट को उपलब्ध स्थान पर फिट करने और हार्ड लाइन ब्रेक का सम्मान करने के लिए लपेट देगा। आप इसे आज़माने के लिए चुनते हैं, तो यह जितना आसान है:

JLabel label = new JLabel("Text that'll wrap if necessary"); 
label.setUI(MultiLineLabelUI.labelUI);

या वैकल्पिक रूप से कस्टम MultiLineLabel वर्ग लपेटकर के अलावा पाठ ऊर्ध्वाधर और क्षैतिज पाठ संरेखण का समर्थन करता है कि का उपयोग करें।

अद्यतन

मैं मूल कोड नमूने के साथ डोमेन खो दिया है। इसे अब गीथब पर देखा जा सकता है: https://github.com/sasjo/multiline

+0

आंतरिक रूप से आप HTML का भी उपयोग करते हैं? – Pacerier

+0

@Pacerier: नहीं, ऐसा नहीं कर सका क्योंकि मुझे लिपटे पाठ पर प्रभाव पेंट करने की आवश्यकता थी। मुझे लगता है कि आप कह सकते हैं कि यह टेक्स्ट को JTextArea के समान तरीकों से तोड़ रहा है। –

+1

@ सैमुअल एसजबर्ग टूटी हुई लिंक 'मल्टीलाइन LabelUI' – oliholz

3

JTextArea में रैपिंग सुविधा का उपयोग करने के बारे में क्या?

String text = "some really long string that might need to"+ 
        "be wrapped if the window is not wide enough"; 

    JTextArea multi = new JTextArea(text); 
    multi.setWrapStyleWord(true); 
    multi.setLineWrap(true); 
    multi.setEditable(false); 

    JLabel single = new JLabel(text); 

    JPanel textpanel = new JPanel(new GridLayout(2,1)); 
    textpanel.add(multi); 
    textpanel.add(single); 

    JFrame frame = new JFrame(); 
    frame.add(textpanel); 
    frame.pack(); 
    frame.setVisible(true); 
+0

अच्छा विचार है लेकिन केवल एक ही दोष है: स्वरूपित पाठ संभव नहीं है। – Robert

0

मैंने लेबल के लिए अधिकतम चौड़ाई निर्दिष्ट करने का प्रबंधन नहीं किया है लेकिन आप एक ठोस चौड़ाई निर्दिष्ट कर सकते हैं। एक JLabel की वर्तमान चौड़ाई को मापने के द्वारा हम केवल नए यदि JLabels की चौड़ाई हमारे maxWidth कि अधिक है के साथ तय आवेदन कर सकते हैं:

JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>"); 
int maxWidth = 400; 
Dimension size = label.getPreferredSize(); 
if (size.width > maxWidth) { 
    // Estimate the number of lines 
    int lineCount = (int) Math.ceil(((double) size.width)/maxWidth); 
    lineCount += 1; // Add one extra line as reserve 
    size.width = maxWidth; // Apply the maximum width 
    // Increase the height so that all lines will be visible 
    size.height *= lineCount; 
    label.setPreferredSize(size); 
} 
7

यदि आप html में पैरा चौड़ाई सेट स्वत: लाइन ब्रेक मिल सकता है।

label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>"); 
1

सरल, HTML का उपयोग करें। जावा स्विंग घटकों हालांकि एचटीएमएल के लिए 'शानदार' समर्थन प्रदान नहीं करता है, आप इसे इस तरह के सरल उद्देश्यों के लिए उपयोग कर सकते हैं।

label.setText("<html>This is first line.<br/>This is second line.</html>");