2010-03-12 4 views
1

사용자가 두 가지 사이를 전환 할 수 있도록 응용 프로그램의 글꼴을 일반 크기에서 큰 크기로 전환 할 수 있도록 Java Swing 응용 프로그램을 업데이트하고 있습니다. 런타임에 크기). 내가 겪고있는 한 가지 문제점은 트리 노드에 HTML을 사용하여 일부 노드의 텍스트에 밑줄을 표시하는 JTree (HTML은 각 트리 노드의 JLabel에 포함되어 있음)입니다. 노드에 대해 알아야 할 추가 사항 중 하나는 각 JLabel 앞에 JCheckBox를 추가하여 사용자 지정 구성 요소라는 점입니다.글꼴 변경시 JTree의 HTML JLabel을 크기를 조정하는 방법

일단 JTree가 표시되면 글꼴 크기를 늘리면 노드 (밑줄이 그어진 텍스트 포함)가 크기가 조정되지 않습니다. 이러한 노드의 HTML은 노드가 더 넓어지는 것을 막아 주므로 글꼴이 변경되면 텍스트가 잘립니다.

내 옵션은 다음 중 하나입니다. 1) 텍스트를 밑줄 긋기위한 또 다른 방법을 사용하십시오. JLabel에서 HTML을 제거하면 글꼴 크기가 변경 될 때 제대로 크기가 조정되거나 2) HTML 서식을 유지하는 것과 폰트 사이즈가 갱신되었을 때에 JTree/JLabel의 사이즈를 강제적으로 변경합니다 (프로퍼티 변경 이벤트를 트리거하는 등).

글꼴 크기가 업데이트되면 코드에서 이미 부모 JFrame의 SwingUtilities.updateComponentTreeUI()를 호출합니다.

EDIT : 응용 프로그램에서 글꼴을 변경하는 데 사용되는 방법은 explained here입니다.

도움을 주시면 감사하겠습니다. 미리 감사드립니다!

- 마이크

+0

큰 질문은 여기에 있습니다 : 어떻게 응용 프로그램에서 글꼴 크기를 변경합니까? 그 질문에 대한 답이 없으면 아무 도움도 없을 것입니다. – Riduidel

+0

주석 주셔서 감사합니다. 폰트가 어떻게 변했는지 설명하는 이전 SO 포스트에 대한 링크를 포함하도록 질문을 편집했습니다. – Mike

답변

2

설명하는 문제를 재현 할 수 없습니다. 당신을 위해 위의 작품은 어쩌면 당신은 당신의 문제가 코드를 줄일 버전을 게시해야하는 경우

public class JTreeFontResize { 
    private static JTree tree; 
    private static JFrame frame; 

    public static void main(String[] args) throws InterruptedException, 
      InvocationTargetException { 
     SwingUtilities.invokeAndWait(new Runnable() { 
      @Override 
      public void run() { 
       tree = new JTree(new Object[] { "One (plain)", 
         "<html><u>Two (HTML)", "<html>Three (HTML)" }); 
       frame = new JFrame("Tree Font Resize"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setBounds(100, 100, 300, 300); 
       frame.add(tree); 
       frame.setVisible(true); 
      } 
     }); 

     Thread.sleep(2000); 
     changeFontSize(20); 

     Thread.sleep(2000); 
     changeFontSize(30); 

     Thread.sleep(2000); 
     changeFontSize(12); 
    } 

    private static void changeFontSize(final int size) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Font font = new Font("Vernanda", Font.PLAIN, size); 
       FontUIResource fontResource = new FontUIResource(font); 
       Enumeration<Object> keys = UIManager.getDefaults().keys(); 
       while (keys.hasMoreElements()) { 
        Object key = keys.nextElement(); 
        Object value = UIManager.get(key); 
        if (value instanceof FontUIResource) { 
         UIManager.put(key, fontResource); 
        } 
       } 
       SwingUtilities.updateComponentTreeUI(frame); 
      } 
     }); 
    } 
} 

: 여기 JavaSE 6 나를 위해 작동 테스트 프로그램입니다.

+0

이것은 올바른 대답입니다. 위의 내용을 토대로 추가 테스트를 한 후에는 각 트리 노드에 확인란을 추가하는 데 사용되는 사용자 지정 구성 요소에 문제가 있습니다. 도와 주셔서 감사합니다! – Mike

관련 문제