2012-08-27 15 views
5

मुझे JTextPane में रैपिंग व्यवहार को समझ में नहीं आता है। यदि मैं एक छोटा टेक्स्ट डालता हूं, तो एक जेकंपोनेंट और फिर फिर से छोटा टेक्स्ट मैं एक पंक्ति में सम्मिलित सामान देख सकता हूं यदि फ्रेम काफी बड़ा है। लेकिन अगर पाठ बहुत लंबा है तो यह कई लाइनों को लेता है, घटक हमेशा एक नई लाइन में रखा जाता है।JTextPane में घटकों के चारों ओर पाठ कैसे लपेटें?

मुझे पता चला है कि एक घटक JTextPane में डाला गया है इसके पाठ को एक वर्ण से अधिक लंबा हो जाता है। तो यदि एक घटक को जेटीक्स्टपेन द्वारा एक चरित्र के रूप में माना जाता है तो यह चरित्र की तरह व्यवहार क्यों नहीं करता है? यह जावा संस्करण पर निर्भर हो सकता है? मैं जावा (टीएम) एसई रनटाइम वातावरण का उपयोग करें (निर्माण 1.7.0-b147)

नीचे मेरी कोड (shortText/LongText साथ चर currentText का दृष्टांत उल्लेख व्यवहार पुन: पेश करने) है:

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.SimpleAttributeSet; 

public class Test { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JTextPane textPane = new JTextPane(); 
     textPane.setContentType("text/html"); 

     String shortText = "one two three four five six seven"; 
     String longText = "A text component that can be marked up with attributes that are represented graphically. You can find how-to information and examples of using text panes in Using Text Components, a section in The Java Tutorial. This component models paragraphs that are composed of runs of character level attributes. Each paragraph may have a logical style attached to it which contains the default attributes to use if not overridden by attributes set on the paragraph or character run. Components and images may be embedded in the flow of text."; 
     String currentText = shortText; 

     try { 
      // insert text before the component 
      textPane.getDocument().insertString(textPane.getDocument().getLength(), currentText, 
        new SimpleAttributeSet()); 

      textPane.setSelectionStart(textPane.getDocument().getLength()); 
      textPane.setSelectionEnd(textPane.getDocument().getLength()); 

      JComboBox component = new JComboBox(); 
      component.setMaximumSize(component.getPreferredSize()); 
      textPane.insertComponent(component); 

      // insert text after the component 
      textPane.getDocument().insertString(textPane.getDocument().getLength(), currentText, 
        new SimpleAttributeSet()); 

     } catch (BadLocationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     textPane.setEditable(false); 

     frame.add(new JScrollPane(textPane)); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

उत्तर

3

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

textPane.setContentType ("text/html"); 

और आप देखेंगे कि उसके बाद सबकुछ ठीक काम करता है। मुझे यकीन नहीं है कि ऐसा क्यों होता है - या तो कुछ प्रतिपादन बग या सिर्फ एक इच्छित व्यवहार हो सकता है।

पीएस मुझे नहीं लगता कि टेक्स्ट फलक के अंदर स्विंग घटकों का उपयोग करना (जो भी कारण है) एक अच्छा विकल्प है। लेकिन यह सिर्फ मेरी राय है ...

+0

हाँ, यह काम करता है। आपको लगता है कि JTextPane का उपयोग करना अच्छा विचार नहीं है? मैं अभ्यास करने के लिए एक कार्यक्रम बनाना चाहता हूँ। अभ्यास में कॉम्बो बॉक्स और टेक्स्ट फ़ील्ड होना चाहिए। उपयोगकर्ता को पाठ को "रेखांकित" (चयन) करने में भी सक्षम होना चाहिए। इसे दूसरी तरह से कैसे करें? JLabels या अक्षम JTextFields का उपयोग करें? आप उनका पाठ नहीं चुन सकते, क्या आप कर सकते हैं? यहां तक ​​कि यदि आप सोच सकते हैं कि हर बार जब आप टेक्स्ट टेक्स्ट करते हैं तो इन तत्वों में से कई को जोड़ना अच्छा नहीं होगा। – ka3ak

+0

@ ka3ak अच्छी तरह से, यह कुछ मामलों में से एक हो सकता है जब यह चीजों को करने का सबसे आसान तरीका है :) –

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