2010-02-08 15 views
5

के साथ जेडडिटरपेन के पसंदीदा आकार को नियंत्रित करना मेरे पास JEditorPane है जो एक पॉपअप के अंदर प्रदर्शित होता है, जो एक बटन के माध्यम से ट्रिगर होता है। फलक, लंबे समय पाठ होता है, इसलिए यह एक JScrollPane अंदर नेस्टेड है, और पॉपअप 300 x 100 के अधिकतम आकार के लिए विवश किया जाता है: JEditorPane उदाहरण के लिए पहली बार में दिखाए जाने परलंबे टेक्स्ट

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      String text = "Potentially looooooong text. " + 
       "Lorem ipsum dolor sit amet, consectetuer" + 
       "adipiscing elit, sed diam nonummy nibh euismod " + 
       "tincidunt ut laoreet dolore magna aliquam" + 
       "adipiscing elit, sed diam nonummy nibh euismod" + 
       "erat volutpat. Ut wisi enim ad minim veniam, " + 
       "quis nostrud exerci tation."; 

      final JEditorPane editorPane = new JEditorPane("text/html", text); 
      editorPane.setEditable(false); 

      final JButton button = new JButton("Trigger Popup"); 
      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        JPopupMenu popup = new JPopupMenu(); 
        popup.setLayout(new BorderLayout()); 
        popup.add(new JScrollPane(editorPane)); 
        Dimension d = popup.getPreferredSize(); 
        int w = Math.min(300, d.width); 
        int h = Math.min(100, d.height); 
        popup.setPopupSize(w, h); 
        Dimension s = button.getSize(); 
        popup.show(button, s.width/2, s.height/2); 
       } 
      }); 

      JFrame f = new JFrame("Layout Demo"); 
      f.setSize(200, 200); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setLocationRelativeTo(null); 
      f.getContentPane().add(button); 
      f.setVisible(true); 
     } 
    }); 
} 

(यानी बटन है जब एक बार क्लिक किया) यह किसी भी तरह एक पसंदीदा ऊंचाई जो बहुत छोटा है (1) रिपोर्ट करने के लिए लगता है:

first invocation

बाद बटन क्लिक करने के बाद, लेआउट कितना भी इसे उम्मीद होती है (2):

subsequent invocations

मैं कैसे लागू कर सकते हैं/एक उचित वांछित माप थोपना तो यह हमेशा की तरह (2) को प्रारंभ होगा?

उत्तर

11

JEditorPane एक साथ अपने अंतिम प्राथमिकता दी चौड़ाई और ऊंचाई की गणना नहीं कर सकते, यह एक पता करने के लिए इससे पहले कि यह अन्य की गणना कर सकता है।

पहले पारित पर, JEditorPane अपनी पसंद के इस धारणा पर आधारित ऊंचाई की गणना करता है कि इसकी चौड़ाई, असीमित हो जाएगा तो यह एक पंक्ति की ऊंचाई देता है (के बाद से पाठ कोई पंक्ति विराम होता है।)

पर दूसरा पास, चौड़ाई पहले ही सेट हो चुकी है (पहले JPopupMenu के आकार से बाधित), और अब यह अधिकतम चौड़ाई जानता है कि यह गणना कर सकता है कि यह कितना लंबा होना चाहिए।

तो सबसे सरल समाधान केवल जब भी आप टेक्स्ट सेट करते हैं तो अधिकतम चौड़ाई निर्धारित करने के लिए होता है।

String text = "Potentially looooooong text. " + 
    "Lorem ipsum dolor sit amet, consectetuer" + 
    "adipiscing elit, sed diam nonummy nibh euismod " + 
    "tincidunt ut laoreet dolore magna aliquam" + 
    "adipiscing elit, sed diam nonummy nibh euismod" + 
    "erat volutpat. Ut wisi enim ad minim veniam, " + 
    "quis nostrud exerci tation."; 

final JEditorPane editorPane = new JEditorPane("text/html", text); 
editorPane.setSize(300, Integer.MAX_VALUE); 
editorPane.setEditable(false); 

यह बहुत बड़ी है, यह अभी भी (सामग्री फिट करने के लिए के रूप में आप अगर आप "Hello, World!" को पाठ बदलने देखेंगे हटना होगा बनाने के बारे में चिंता मत करो

+0

@finnw:। बहुत बढ़िया विवरण और काम के आसपास - बहुत बहुत धन्यवाद! – netzwerg

+1

उत्कृष्ट समाधान, +1! हालांकि यह थोड़ा सा समय रहा है, मेरे पास आपके लिए एक और अच्छा सवाल है। मैंने JTextPane के साथ एक ही दृष्टिकोण की कोशिश की, यह एक जेडडिटरपेन सबक्लास के अलावा कुछ भी नहीं है। और यह ' टी काम। मैं समझने के लिए गहराई (BasicTextUI) में जाने की कोशिश कर रहा हूं कि अंतर कहां है। लेकिन शायद आप इसे पहले ही जानते हैं? :-) – AgostinoX