2010-02-08 1 views
5

나는 JEditorPane을 단추를 통해 트리거 된 팝업 안에 표시합니다. 창 따라서 그것은 JScrollPane 안에 중첩 것, 긴 텍스트를 포함하고 팝업가 300 × 100의 최대 크기로 제한됩니다 다음 JEditorPane 인스턴스가 처음으로 표시되면긴 텍스트를 가지는 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) : 그것은 항상 같이 (2) 초기화 할 수 있도록

subsequent invocations

내가 적용 할 수 있습니다 방법/적절한 적절한 사이즈를 부과?

답변

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과 동일한 접근 방식을 시도했는데, JEditorPane 하위 클래스 일뿐입니다. t 작업. 나는 차이 (BasicTextUI)를 이해하려고 깊이 들어가려고 노력하고있다. 그러나 아마 당신은 이미 그것을 알고 있는가? :-) – AgostinoX