2011-12-29 14 views
16

जावा के सभी संस्करणों में 6 तक, JSTrollPane के अंदर रखे गए JTextPane का डिफ़ॉल्ट व्यवहार था: यदि संभव हो तो शब्द सीमाओं पर रेखाएं लपेटें। यदि नहीं, तो फिर भी उन्हें लपेटें।JTextPane (जावा 7) में लंबे शब्द लपेटें

जेडीके 7 में, डिफ़ॉल्ट व्यवहार ऐसा प्रतीत होता है: यदि संभव हो तो शब्द सीमाओं पर रेखाएं लपेटें। यदि नहीं, तो बस JTextPane की चौड़ाई का विस्तार करें (लंबे शब्दों को कभी भी लपेटें नहीं)।

यह यहाँ यह पुन: पेश करने के लिए आसान है, एक SSCCE है:


public class WrappingTest extends JFrame 
{ 

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

    public WrappingTest() 
    { 
     setSize(200,200); 
     getContentPane().setLayout(new BorderLayout()); 
     JTextPane jtp = new JTextPane(); 
     JScrollPane jsp = new JScrollPane(jtp); 
     jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     getContentPane().add(jsp,BorderLayout.CENTER); 
     setVisible(true); 
    } 

} 

बस, JDK 6 में और JDK 7 में इसे चलाने के कुछ छोटे शब्द लिखते हैं, और एक लंबे शब्द लिखते हैं, और आप देखेंगे अंतर।

मेरा प्रश्न सरल है ... जेडीके 7 में नया डिफ़ॉल्ट व्यवहार पूरी तरह से मेरे कार्यक्रम को गड़बड़ कर देता है (उन्हें ओरेकल में इस प्रकार के डिफ़ॉल्ट को बदलने के साथ और अधिक सावधान रहना चाहिए ... वे महत्वहीन प्रतीत होते हैं लेकिन जब आप उपयोग कर रहे हैं एक जेटीक्स्टपेन जिसमें डेटा प्रदर्शित करने के लिए आमतौर पर अक्षरों के बहुत लंबे तार होते हैं, वे इतने महत्वहीन नहीं होते हैं - असल में मैं एक बग रिपोर्ट दर्ज करने जा रहा हूं, लेकिन अगर मैं हल नहीं करता हूं तो मैं एक कामकाज करना चाहता हूं यह)। पिछले व्यवहार पर वापस जाने का कोई तरीका?

ध्यान दें कि मैंने संबंधित प्रश्न How is word-wrapping implemented in JTextPane, and how do I make it wrap a string without spaces? के उत्तर की जांच की है लेकिन यह इस प्रश्न का उत्तर नहीं देती है - यह बिना किसी सम्मान के JTextPane लपेटने का एक तरीका प्रदान करता है, लेकिन मेरे लिए वांछित व्यवहार विभाजित है यदि संभव हो तो व्हाइटस्पेस पर लाइनें, और यदि संभव नहीं है तो (कहीं भी पिछले जावा संस्करणों में)।

+0

का उपयोग कर करता है [ 'invokeLater()'] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/ प्रारंभिक.html) मदद? –

+0

नहीं ... एक ही प्रभाव। –

+0

मुझे बिल्कुल वही समस्या है। संबंधित: https://forums.oracle.com/forums/thread.jspa?threadID=2374090 (कोई जवाब नहीं ...) पोस्टर ने पहले से ही एक बग रिपोर्ट बनाई है, लेकिन इसे "बग नहीं" के रूप में बंद कर दिया गया था, बिना स्पष्टीकरण का शब्द ... – PhiLho

उत्तर

1

इस बग पर एक नज़र डालें:

http://bugs.sun.com/view_bug.do?bug_id=6539700

+0

धन्यवाद, यह उल्लेखनीय रूप से समान है ... लेकिन दुर्भाग्यवश यह एक ही बग प्रतीत नहीं होता है (इसे विशेषता सेट के साथ करना है, और बहुत पहले तय किया गया था):/ –

+0

अच्छा, मुझे लगता है कि यह संबंधित है, हालांकि 1.6 में व्यवहार नहीं बदला गया था। टिप्पणी को देखें: "यह ध्यान दिया जाना चाहिए कि अनुरोधित डिफ़ॉल्ट विभाजन व्यवहार (ब्रेकइटरेटर द्वारा कोई वैध ब्रेकपॉइंट नहीं मिलने पर मनमाने ढंग से ग्लीफ व्यू को तोड़ना) बहुत गलत है और भविष्य में या अतीत में किसी भी जेडीके रिलीज में बहाल नहीं किया जाना चाहिए।" ऐसा लगता है कि हमें अब और अधिक काम करने की जरूरत है ... – PhiLho

1

हाय मैं एक ही समस्या थी, लेकिन मिल गया है एक काम के आसपास:

सिर्फ JTextPane जैसे की एक विस्तारित वर्ग बनाने

 MyWrapJTextPane extends JTextPane 

और निम्न विधि के ऊपर लिख - यह @ dk89 से ;-)

 public boolean getScrollableTracksViewportWidth() { 
      return true; 
     } 
+0

क्षमा करें: कोई काम नहीं करता है! यह केवल लंबी लाइनों (सफेद-रिक्त स्थान वाले) के साथ समस्या हल करता है - वे अब सही ढंग से लपेटे गए हैं - लेकिन लंबे शब्द अभी भी लपेट नहीं गए हैं :-( – Thomwiesel

2

अच्छा पकड़ से काम करता है, लेकिन दिया समाधान अफसोस काम नहीं करते: JDK 7 जाहिरा तौर पर अभी भी एक प्रदान नहीं करता है एक JTextComponent पर एक कस्टम BreakIterator सेट करने के लिए प्रतीक्षा करें; ग्लाइफव्यू पर भी नहीं, जहां ब्रेकइटरेटर की पीढ़ी निजी है। और यदि हम स्ट्रिंग चार को चार से सम्मिलित करते हैं, तो यह अभी भी काम नहीं करता है: मुझे लगता है कि समान शैली (एट्रिब्यूटसेट) के साथ टेक्स्ट के लगातार रन एक साथ ध्वस्त हो जाते हैं।

मैंने कस्टम संपादककिट करने की कोशिश करने में दो दिन बिताए हैं, जैसा कि कहीं और सलाह दी गई है, लेकिन पाठ के रूप में यह अच्छी तरह से काम नहीं करता है (जेडीके 1.7.0_4 कम से कम)।

मैं समाधान How to word wrap text stored in JTextPanes which are cells in a JList पर दिया जाता है और एक प्रकार http://www.experts-exchange.com/Programming/Languages/Java/Q_20393892.html

में पाया की कोशिश की लेकिन मैं breakView नहीं रह गया है कहा जाता है कि जब JTextPane वाक्य में सबसे लंबा शब्द से छोटा होता है पता चला। तो यह बिल्कुल काम नहीं करता है जब केवल एक (लंबा) शब्द होता है। यह हमारा मामला है, क्योंकि हम उपयोगकर्ता द्वारा प्रदत्त, पहचानकर्ता-जैसी तारों को प्रदर्शित करते हैं, अक्सर रिक्त स्थान के बिना, छोटी जगहों में।

अंततः मुझे एक साधारण समाधान मिला, जो कि बग रिपोर्ट में सुझाव से लिया गया: वास्तव में, चार द्वारा स्ट्रिंग चार डालें, लेकिन वैकल्पिक शैलियों! इस प्रकार, हमारे पास कई सेगमेंट हैं क्योंकि हमारे पास अक्षर हैं, और स्ट्रिंग को चार सीमाओं पर लपेटा गया है। अगले "बग फिक्स" तक?

कोड के टुकड़े:

private JTextPane tp; 
private SimpleAttributeSet sas = new SimpleAttributeSet(); 

tp= new JTextPane(); 
sas.addAttribute("A", "C"); // Arbitrary attribute names and value, not used actually 

    // Set the global attributes (italics, etc.) 
    tp.setParagraphAttributes(styleParagraphAttributes, true); 

    Document doc = tp.getDocument(); 
    try 
    { 
     doc.remove(0, doc.getLength()); // Clear 
     for (int i = 0; i < textToDisplay.length(); i++) 
     { 
      doc.insertString(doc.getLength(), textToDisplay.substring(i, i+1), 
        // Change attribute every other char 
        i % 2 == 0 ? null : sas); 
     } 
    } 
    catch (BadLocationException ble) 
    { 
     log.warn("Cannot happen...", ble); 
    } 

के रूप में बग में कहा गया है, वे एक आसान तरीका है (कुछ संपत्ति शायद, या कुछ इंजेक्शन सामान) पुराने व्यवहार पर वापस लौटने के लिए प्रदान की जानी चाहिए थी।

11

मेरे लिए ठीक काम करता है (1.7.0_09 के तहत परीक्षण किया)

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

public class WrapTestApp extends JFrame { 

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

    public WrapTestApp() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(200,200); 
     getContentPane().setLayout(new BorderLayout()); 
     JTextPane jtp = new JTextPane(); 
     jtp.setEditorKit(new WrapEditorKit()); 
     JScrollPane jsp = new JScrollPane(jtp); 
     jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     getContentPane().add(jsp, BorderLayout.CENTER); 
     jtp.setText("ExampleOfTheWrapLongWordWithoutSpaces"); 
     setVisible(true); 
    } 

    class WrapEditorKit extends StyledEditorKit { 
     ViewFactory defaultFactory=new WrapColumnFactory(); 
     public ViewFactory getViewFactory() { 
      return defaultFactory; 
     } 

    } 

    class WrapColumnFactory implements ViewFactory { 
     public View create(Element elem) { 
      String kind = elem.getName(); 
      if (kind != null) { 
       if (kind.equals(AbstractDocument.ContentElementName)) { 
        return new WrapLabelView(elem); 
       } else if (kind.equals(AbstractDocument.ParagraphElementName)) { 
        return new ParagraphView(elem); 
       } else if (kind.equals(AbstractDocument.SectionElementName)) { 
        return new BoxView(elem, View.Y_AXIS); 
       } else if (kind.equals(StyleConstants.ComponentElementName)) { 
        return new ComponentView(elem); 
       } else if (kind.equals(StyleConstants.IconElementName)) { 
        return new IconView(elem); 
       } 
      } 

      // default to text display 
      return new LabelView(elem); 
     } 
    } 

    class WrapLabelView extends LabelView { 
     public WrapLabelView(Element elem) { 
      super(elem); 
     } 

     public float getMinimumSpan(int axis) { 
      switch (axis) { 
       case View.X_AXIS: 
        return 0; 
       case View.Y_AXIS: 
        return super.getMinimumSpan(axis); 
       default: 
        throw new IllegalArgumentException("Invalid axis: " + axis); 
      } 
     } 

    } 
} 
+0

जावा 7 के लिए +1 :-), दिलचस्प व्यूफैक्टरी – mKorbel

+1

वास्तव में हमें केवल आवश्यकता है एक्स_एक्सआईएसआईएस के लिए लेबल व्यू रिटर्न 0 के न्यूनतम न्यूनतम() को जाने देना है। ViewFactory डिफ़ॉल्ट लेबलव्यू – StanislavL

+0

को बदलने का एक तरीका है, मैं इसे देख और प्राप्त कर सकता हूं, धन्यवाद, 'jtp.setComponentOrientation (RTL) के लिए काम करने के लिए बिल्कुल सही है; ' – mKorbel

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