2010-02-08 21 views
5

Bir düğmeyle tetiklenen bir açılır pencerede görüntülenen bir JEditorPane sahibim. bölmesi bu nedenle bir JScrollPane içine yuvalanmış oluyor, uzun bir metni içerir ve pop-up 300 x 100'lük bir maksimal boyuta sınırlandırılmıştır: JEditorPane örneği ilk kez gösterildiğindeBir JEditorPane'in tercih edilen boyutunu uzun metinle kontrol etme

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); 
     } 
    }); 
} 

(düğmedir yani zaman bir şekilde çok küçük bir tercih yüksekliğe (1) rapor etmek görünüyor) bir kez tıklandığında: müteakip düğme tıklama sonra

first invocation

, düzen kimse beklenebilir nasıl adildir (2): Bu her zamanki gibi (2) başlatmak diye

subsequent invocations

ı zorlamak nasıl/uygun bir tercih boyutu empoze?

cevap

11

JEditorPane bunun diğer hesaplayabilir önce bir bilmek zorunda, aynı anda, tercih edilen son bir genişliğe ve yükseklik hesaplanamaz. İlk geçişte

, JEditorPane tek bir hat yüksekliğini döndürür, böylece genişliği, sınırsız varsayımına göre, tercih edilen yükseklik hesaplar (metin bir satır sonu içeren beri.)

üzerinde ikinci geçişte, genişlik zaten ayarlanmıştı (ilk JPopupMenu'un büyüklüğüyle sınırlanmıştır) ve şimdi maksimum boyunun ne kadar uzun olması gerektiğini hesaplayabileceğini biliyor.

Bu nedenle en basit çözüm, metni ayarladığınız zaman, genişliği maksimum değere ayarlamaktır.

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); 

çok büyük, hala sen "Hello, World!" metni değiştirirseniz göreceğiniz gibi (içeriği sığdırmak için küçüleceği yapma konusunda endişelenmeyin

+0

@finnw:. Mükemmel bir açıklama ve iş çevresinde - çok teşekkür ederim! – netzwerg

+1

Mükemmel çözüm, +1! Biraz zaman olmasına rağmen, sizin için başka bir iyi soru var. JTextPane ile aynı yaklaşımı denedim, bu bir JEditorPane alt sınıfından başka bir şey değil. Ben, farkın nerede olduğunu anlamak için derinlere (BasicTextUI) gitmeye çalışıyorum ama belki zaten biliyor musun? :-) – AgostinoX

İlgili konular