2010-06-07 11 views
6

요소의 글꼴 크기가 나머지 스윙 응용 프로그램과 다른 스윙 패널을 만들려고합니다. 처음에는 몇 가지 구성 요소에 setFont을 사용하여 문제가 발생하지 않았습니다. 이제는 여러 구성 요소 (및 모든 하위 구성 요소)가 있으므로이 솔루션은 비실용적입니다.JPanel 및 모든 요소의 글꼴 크기 변경

스윙 구성 요소의 기본 UI 속성을 변경하는 방법을 검색했습니다. 내가 발견 한 것은 UIManager를 사용하는 것이 대부분입니다. UIManager는 속성을 전역 적으로 변경합니다. 다른 모든 패널의 현재 글꼴 설정을 유지하기 때문에이 기능이 작동하지 않습니다. 순간

(그리고 내가 처음 무언가를 시도하지 않고 게시하고 싶지 않기 때문에),이 같은 알고리즘이 있습니다

public static void fixFont(Container c) { 
    c.setFont(c.getFont().deriveFont(10.0f)); 
    Component[] comp = c.getComponents(); 
    for (int i=0;i<comp.length;++i) { 
     if (comp[i] instanceof Container) { 
      fixFont((Container) comp[i]); 
     } else { 
      comp[i].setFont(comp[i].getFont().deriveFont(10.0f)); 
     } 
    } 
} 

문제는 그런 :

  • 그 테두리와 같은 특정 스윙 요소는 포함하지 않습니다.
  • 내가 다른 구성 요소를 추가 할 때 동적으로 질문

이 함수를 호출해야

  • : 폰트 스윙 패널의 속성과 모든 구성 요소, 요소에서 등 (즉, 모든 것을 변경하는 또 다른 방법이 있나요 패널)? 당신이 트릭을 사용할 수

  • 답변

    4

    아이디어에 대한

    감사 :

    import java.awt.*; 
    
    public class FrameTest { 
    
        public static void setUIFont(FontUIResource f) { 
         Enumeration keys = UIManager.getDefaults().keys(); 
         while (keys.hasMoreElements()) { 
          Object key = keys.nextElement(); 
          Object value = UIManager.get(key); 
          if (value instanceof FontUIResource) { 
           FontUIResource orig = (FontUIResource) value; 
           Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize()); 
           UIManager.put(key, new FontUIResource(font)); 
          } 
         } 
        } 
    
        public static void main(String[] args) throws InterruptedException { 
    
         setUIFont(new FontUIResource(new Font("Arial", 0, 20))); 
    
         JFrame f = new JFrame("Demo"); 
         f.getContentPane().setLayout(new BorderLayout()); 
    
         JPanel p = new JPanel(); 
         p.add(new JLabel("hello")); 
         p.setBorder(BorderFactory.createTitledBorder("Test Title")); 
    
         f.add(p); 
    
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         f.setSize(300, 300); 
         f.setVisible(true); 
        } 
    } 
    

    는 생산 :

    enter image description here

    +0

    패널의 글꼴과 모든 요소 만 변경하고 싶습니다. 다른 패널의 글꼴을 변경하고 싶지 않습니다. UIManager를 사용하여이 작업을 수행하면 모든 Swing 구성 요소의 글꼴이 변경됩니다. – YuppieNetworking

    +0

    아, 좋은 지적이야. 당신이 정말로 필요로하는 것을 깨닫지 못했습니다. 당신의 질문을 이해할 수있게 지금 어떻게 해결할 수 있을지 확신 할 수 없습니다. – aioobe

    +1

    하나의 "백업"솔루션은 지금처럼 해보고,'getBorder'와'instanceof TitledBorder' /'TitledBorder.setTitleFont' 등을 통해서도 경계를 확인하고 업데이트 할 것입니다. – aioobe

    1

    당신이 당신의 기본 구성 요소에 add 방법을 무시하고 글꼴을 적용 할 수 추가 된 구성 요소와 그 하위 요소가 있습니다. 이렇게하면 나중에 구성 요소를 추가 할 때 글꼴을 수동으로 적용하지 않아도됩니다.

    +0

    국경 등에서는 여전히 작동하지 않을 것입니다 ... – aioobe

    +0

    패널 안의 모든 요소에 대해 작동하지 않습니다. 예 : 레이블이있는 JPanel이있는 JPanel입니다. – YuppieNetworking

    +0

    은 경계선에서 작동하지 않을 수 있지만 '추가'구현에 원하는 코드를 넣을 수 있으므로 질문에 코드와 같은 것을 호출 할 수 없습니다. 기본적으로, 나는 이것이 쉬운 대답이라고 생각하지 않는다. 그것은 '깔끔한'조작입니다. – pstanton