2010-11-03 4 views
12

सभी उदाहरण है कि मुझे लगता है कि एक JTextArea का उपयोग पा सकते हैं में, ऊंचाई & चौड़ाई JTextArea निर्माण करने से पहले जाना जाता है, और अगर JTextArea अधिक ऊंचाई की आवश्यकता होगी, तो यह एक JScrollPane के अंदर डाल दिया है। जाहिर है, JTextArea की ऊंचाई चौड़ाई और पाठ सामग्री पर निर्भर है।मैं एक निर्दिष्ट चौड़ाई के साथ एक JTextArea कैसे बना सकता हूं और सभी पाठ प्रदर्शित करने के लिए आवश्यक न्यूनतम संभव ऊंचाई?

अब, मेरी स्थिति की आवश्यकता है कि मैं JScrollPane का उपयोग न करें, लेकिन इसके बजाय JTextArea सभी टेक्स्ट प्रदर्शित करने के लिए पर्याप्त लंबा हो। जब मैं JTextArea बनाता हूं, तो मुझे टेक्स्ट सामग्री पता है और इसे कितनी चौड़ाई के साथ काम करना होगा; मुझे ऊंचाई नहीं पता - मैं चाहता हूं कि किसी भी पाठ को काट दिए बिना जितना संभव हो उतना छोटा हो। यह पूरा करना बहुत मुश्किल लगता है।

एक साइड नोट के रूप में, JTextArea को JPanel में जोड़ा जाएगा जिसमें लेआउट मैनेजर नहीं है - यह अतिरिक्त घटक के पसंदीदा आकार के आधार पर पूर्ण स्थिति का उपयोग करता है। इसके लिए यह आवश्यक है कि मेरा JTextAreagetPreferredSize() पर सही आयाम वापस करेगा। सही आयाम चौड़ाई होना चाहिए जो मैंने इसे बनाया था, और न्यूनतम ऊंचाई जो प्रदान की गई चौड़ाई के साथ सभी पाठ प्रदर्शित करने के लिए आवश्यक है।

मुझे कुछ समान धागे मिले हैं जो JTextArea से जुड़े विषमता/बग पर चर्चा करते हैं जिन्हें कभी-कभी माता-पिता कंटेनर पर pack() पर कॉल करके हल किया जाता है। यह मेरे लिए एक विकल्प नहीं है। मैं मूल रूप से अपना खुद का JTextArea बनाने का लुत्फ उठाता हूं जो चौड़ाई और स्ट्रिंग लेता है और चौड़ाई और फ़ॉन्ट सेटिंग्स के आधार पर आवश्यक न्यूनतम ऊंचाई की गणना करता है, लेकिन मुझे लगा कि मैं ऐसा करने के लिए समय बिताने से पहले पूछूंगा।

उम्मीद है कि मेरा प्रश्न स्पष्ट है। आपकी मदद के लिए आप सभी को शुक्रिया!

+0

क्या JLextArea के बजाय जेएलएबल क्या करेगा? –

+0

@ एंड्रयू थॉम्पसन निश्चित रूप से, मैं 'जेलाबेल' का उपयोग कर सकता हूं, लेकिन फिर भी मुझे स्ट्रिंग में मैन्युअल रूप से न्यूलाइन डालना होगा, जिसके लिए मुझे गणना करने की आवश्यकता होगी कि उन्हें चौड़ाई और फ़ॉन्ट सेटिंग्स के आधार पर कहां होना चाहिए, और फिर मैं पात्रों की बजाय पूरे शब्दों पर लपेटने के लिए कुछ विशेष हैंडलिंग जोड़ना होगा। ये 'JTextArea' द्वारा प्रदान की जाने वाली चीजें हैं, इसलिए यदि मैं कर सकता हूं तो मैं इसका उपयोग करना पसंद करूंगा। –

+0

नीचे उदाहरण देखें। मैं ऐसी चीजों को प्राप्त करने के लिए एक छोटी 'एचटीएमएल चाल' का उपयोग करना पसंद करता हूं। ;) –

उत्तर

5

यह जोड़ा घटक के पसंदीदा आकार के आधार पर पूर्ण स्थिति का उपयोग करता है होना चाहिए।

लेआउट प्रबंधक के काम की तरह लगता है।

यह आवश्यक है कि मेरा JTextArea getPreferredSize() पर सही आयाम वापस करेगा।

JTextArea textArea = new JTextArea(); 
textArea.setLineWrap(true); 
textArea.setWrapStyleWord(true); 
textArea.setText("one two three four five six seven eight nine ten"); 
System.out.println("000: " + textArea.getPreferredSize()); 
textArea.setSize(100, 1); 
System.out.println("100: " + textArea.getPreferredSize()); 
textArea.setSize(textArea.getPreferredSize()); 
+0

मैं लेआउट मैनेजर का उपयोग नहीं कर सकता - मैंने उन सभी की कोशिश की और निष्कर्ष निकाला कि पूर्ण स्थिति का उपयोग करना आसान था। मेरा मतलब है '... यह जोड़ा घटक के पसंदीदा आकार के आधार पर पूर्ण स्थिति का उपयोग करता है' यह था कि इस विधि पर भरोसा किया गया है, इसलिए यह सही होना चाहिए। –

+0

वाह! यह काम! आपको बहुत - बहुत धन्यवाद! मैंने कभी कोशिश नहीं की होगी। –

+0

आपको एक लेआउट मैनेजर का उपयोग करने के लिए मजबूर नहीं किया जाता है। आप नौकरी पाने के लिए विभिन्न लेआउट प्रबंधकों के साथ नेस्टेड पैनलों का उपयोग कर सकते हैं। फिर "घटक के पसंदीदा आकार के आधार पर स्थिति निर्धारित करना" वास्तव में एक लेआउट प्रबंधक का काम है। यदि आप मौजूदा लेआउट प्रबंधकों को पसंद नहीं करते हैं, तो अपना खुद का लिखें। वैसे भी आप वही कर रहे हैं, जब आप लेआउटमैनेजर इंटरफ़ेस को कार्यान्वित करते हैं, तो आपके पास कोड के लिए एक प्रसिद्ध इंटरफ़ेस है। – camickr

-1

शायद अगर आप अपनी चौड़ाई को जानते हैं तो आप कुछ परीक्षण चला सकते हैं और टेक्स्ट के प्रत्येक चरित्र को कितना चौड़ा कर सकते हैं, इस तरह आप यह निर्धारित करने के लिए एक लूप का उपयोग कर सकते हैं कि प्रत्येक पंक्ति पर कितने अक्षर फिट होते हैं और कुल वर्ण दिखाया जाए, तो आप ऊंचाई निर्धारित कर सकते हैं कि कितनी लाइनें होनी चाहिए।

कहें कि आपके टेक्स्ट में रिक्त स्थान सहित 1000 वर्ण हैं, और एक वर्ण की चौड़ाई 4 पिक्सेल के बराबर है, तो आप चौड़ाई 400 है कि प्रत्येक पंक्ति पर 100 वर्ण फिट होने पर काम कर सकते हैं, इसके बाद आपको 10 लाइनों की आवश्यकता होगी। अब कहते हैं कि ऊंचाई फ़ॉन्ट आकार के लिए 10 है, तो आप अब पता है कि तुम 10 x 10 == 100 पिक्सल की जरूरत है, तो अपने TextArea 400x100

+0

यह दृष्टिकोण गैर निश्चित चौड़ाई फ़ॉन्ट्स के लिए काम नहीं करता है। जब शब्दों को लपेटा जाता है, तो लाइन के अंत का हिस्सा बर्बाद करते समय और समस्याएं आती हैं। –

+0

आपके उत्तर के लिए धन्यवाद, लेकिन जैसा कि कहा गया है, यदि मैं परिवर्तनीय आकार के फ़ॉन्ट (जिसे मुझे चाहिए) का समर्थन करना चाहता हूं तो यह दृष्टिकोण काफी काम नहीं करता है। इसके अलावा, ये सभी चीजें 'JTextArea' द्वारा प्रदान की गई हैं, इसलिए मैं पहिया का पुन: आविष्कार नहीं करना चाहूंगा। –

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

class FixedWidthLabel { 

    public static void main(String[] args) { 

     Runnable r = new Runnable() { 
      public void run() { 
       String pt1 = "<html><body width='"; 
       String pt2 = 
        "px'><h1>Label Height</h1>" + 
        "<p>Many Swing components support HTML 3.2 &amp;" + 
        " (simple) CSS. By setting a body width we can cause the " + 
        " component to find the natural height needed to display" + 
        " the component.<br><br>" + 
        "<p>The body width in this text is set to " + 
        ""; 
       String pt3 = 
        " pixels." + 
        ""; 

       JPanel p = new JPanel(new BorderLayout()); 

       JLabel l1 = new JLabel(pt1 + "125" + pt2 + "125" + pt3); 
       p.add(l1, BorderLayout.WEST); 

       JLabel l2 = new JLabel(pt1 + "200" + pt2 + "200" + pt3); 
       p.add(l2, BorderLayout.CENTER); 

       JOptionPane.showMessageDialog(null, p); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

AhhHh बहुत चालाक! अच्छी नौकरी, और यह सब आवश्यक था 'बॉडी' टैग का उपयोग कर रहा था। –

0

समाधान FixedWidthLabel में वर्णित है, <html><body width="..." का उपयोग कर प्रोग्रामर की आवश्यकता होती है एचटीएमएल स्ट्रिंग के हिस्से के रूप संदेश प्रदान करने के लिए होगा।

संदेश invalid integer: i<0 not allowed की तरह कुछ है, तो तो < भाग निकले जा करने के लिए (इनकोडिंग?), अन्यथा नहीं है कह रही है कि कैसे JLabel एचटीएमएल व्याख्या करेगा नहीं होगा।

इससे इस समाधान में जटिलता बढ़ जाती है।

केवल अगर आप जानते हैं कि संदेश में ऐसे कोई वर्ण नहीं हैं, तो आप ठीक होंगे।

+0

या .. यदि आप उन्हें HTML के रूप में एन्कोड करते हैं। –

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

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