2013-07-22 10 views
3

고유 한 사용자 지정 UI로 사용자 지정 구성 요소를 만들고 있습니다. 질문 How to create a custom Swing Component은 구성 요소 개발에 큰 도움이되었지만 사용자 정의 구성 요소를 UI에 연결하는 좋은 방법을 찾을 수 없었습니다.사용자 지정 구성 요소에 대한 올바른 UI 구현을 결정하는 방법

How to Write a Custom Swing Component의 코드는 훌륭하지만 JFlexiSlider.updateUI 하드 코딩 UI의 구현 BasicFlexiSliderUI을 사용 :

public void updateUI() { 
    if (UIManager.get(getUIClassID()) != null) { 
     setUI((FlexiSliderUI) UIManager.getUI(this)); 
    } else { 
     setUI(new BasicFlexiSliderUI()); 
    } 
} 

표준 스윙 구성 요소가 updateUI 단순히 UIManager.get(this)에서 직접 UI를 설정 구현합니다. UIClassID에서 실제 구현으로의 매핑은 BasicLookAndFeel 및 하위 클래스에 있습니다.

필자가 새로운 모양과 느낌을 만들고 싶지 않은 경우, UIClassID에서 실제 구현으로의 기본 매핑을 어디에서 설정할 것입니까? 구성 요소 클래스 외부에 있어야하는 것처럼 보이지만 사용자 지정 구성 요소를 처음 사용하기 전에 UIDefaults 개체에 추가해야합니다.

+2

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

이것은 어려운 문제입니다. 자신의 UI를 넣을 좋은 곳은 없습니다. UIManager에 넣으려고하면 코드가 자체 포함 된 라이브러리처럼 잘 작동하지 않습니다. 그렇지 않으면 다른 모양으로 사용할 수없고 너무 쉽게 느껴집니다. –

답변

3

필수 협력자 :

  • (getUIClassID에) 고유 uiClassID의보고해야합니다 사용자 정의 구성 요소
  • 사용자 정의 UI 위양
  • 하는 UIManager가 UI로 사용자 정의 uiClassID의 매핑 할 수있는 장소입니다 구성 요소를 인스턴스화하기 전에 (사용자 지정 구성 요소에 사용할 것으로 예상되는) 위임 클래스

코드에서 :

/** 
* The custom component 
*/ 
public class Block extends JComponent { 

    private final static String ID = "BlockUI"; 

    public Block(Color color) { 
     // configure 
     setBackground(color); 
     // install ui 
     updateUI(); 
    } 


    @Override 
    public void updateUI() { 
     // ask the ui manager for an appropriate ui and set it 
     setUI(UIManager.getUI(this)); 
    } 

    /** 
    * Implemented to return a unique component class identifier 
    */ 
    @Override 
    public String getUIClassID() { 
     return ID; 
    } 

} 

/** 
* For each supported LAF, a laf-specific implementation 
*/ 
public class BasicBlockUI extends ComponentUI { 

    public static ComponentUI createUI(JComponent c) { 
     return new BasicBlockUI(); 
    } 

    @Override 
    public void paint(Graphics g, JComponent c) { 
     g.setColor(c.getBackground()); 
     g.fillRect(10,10, c.getWidth()- 20, c.getHeight()-20); 
    } 

} 

// usage 

//let the ui manager know of our component 
// the value must be the fully qualified classname 
UIManager.put("BlockUI", "org.jdesktop.swingx.plaf.BasicBlockUI"); 

JXFrame frame = new JXFrame("custom box", true); 
Block block = new Block(Color.RED); 
frame.add(block); 
frame.setSize(200, 200); 
frame.setVisible(true); 

여러 LAF를 지원하려면 사용자 정의 구성 요소를 플러그인하는 최신 QA which illustrates the SwingX 메커니즘을 조사해야합니다.

+0

'UIManager.put ("BlockUI", ...) '에 대한 호출은 일반적으로 어디에서 이루어 집니까? 여러 개의 별도 라이브러리가있는 대규모 프로젝트가있는 경우 응용 프로그램의 중앙 위치에서 쉽게 수행 할 수 없습니다. –

+0

어쨌든 LAF를 설정하는 곳은 – kleopatra

+0

입니다. @RangiKeen 어쨌든 더 쉬운 해결책은 swingx 메커니즘입니다. 사용자 정의 구성 요소를 추가하면 수동으로 추가 할 필요가 없습니다 .-) – kleopatra

0

setUI을 사용하여 구성 요소의 UI를 설정할 수 있습니다.

+0

그건 사실이지만 내 질문은 실제로 어떻게 UIClassID에서 현재의 모양과 느낌에 적합한 구체적인 구현으로 매핑을 결정하는 것입니다. 이것은 내용에 있었지만 제목이 오해의 소지가 있으므로이 내용을 더 분명하게하기 위해 업데이트했습니다. –