2010-07-08 2 views
1

나는 기본적으로 SynthStyle, SynthPainter 및 SynthStyleFactory의 커스텀 버전을 제공하면서 Synth를 사용하여 사용자 정의 "Steampunk"테마 룩앤필을 구현하려고합니다.커스텀 Synth Look & Feel의 체크 박스 레이아웃 제어하기

XML을 사용하지 않고 있습니다. 즉, 모든 것이 Java API를 통해 수행됩니다. 일반적으로 이것은 잘 작동하고 실제로 꽤보기 흉하게 보이기 시작합니다.

그러나 JCheckBox와 같은 일부 "복합"구성 요소에 문제가 있습니다. SynthPainter로 paintCheckBoxBackground()가 불려 갔을 때, 좌표는 JCheckBox가 가리키는 전체 영역을 참조합니다.

이 영역에서 확인란 아이콘과 텍스트를 별도로 그려야하는 위치를 어떻게 결정해야합니까? 여기에만 가장 일반적인 경우로 촬영되어,

public void paintCheckBoxBackground(SynthContext context, Graphics g, int x, int y, int w, int h){ 

    AbstractButton c = (AbstractButton) context.getComponent(); 
    String text = c.getText(); 
    Icon icon = c.getIcon(); 
    if (icon == null){ 
     icon = context.getStyle().getIcon(context, "CheckBox.icon"); 
    };   
    int iconTextGap = c.getIconTextGap();  

    Rectangle componentRect = new Rectangle(); 
    Rectangle iconR = new Rectangle(); 

    Insets insets = new Insets(0, 0, 0, 0); 
    if (context.getRegion().isSubregion()){ 
     insets = context.getStyle().getInsets(context, insets); 
    } 
    else{ 
     insets = context.getComponent().getInsets(insets); 
    } 

    componentRect.x = insets.left; 
    componentRect.y = insets.top; 
    componentRect.width = c.getWidth() - (insets.left + insets.right); 
    componentRect.height = c.getHeight() - (insets.top + insets.bottom); 

    if (icon != null){ 
     iconR.x += componentRect.x; 
     iconR.y += componentRect.y; 
     iconR.width = icon.getIconWidth(); 
     iconR.height = icon.getIconHeight(); 

     g.setColor(Color.GREEN); 
     g.fillRect(iconR.x, iconR.y, iconR.width, iconR.height); 
    } 
    if (text != null){ 
     g.setColor(Color.RED); 
     int textPos = iconR.x + iconR.width + iconTextGap; 
     g.fillRect(textPos, iconR.y, c.getWidth() - insets.right - textPos, componentRect.height);    
    } 
} 

하시기 바랍니다 고려 :

답변

1

음, 도움이 될 것입니다 다음과 MB (코드는 JCheckBox에와 관련된 사용자 정의 화가에 투입하는 것입니다) 계정 (왼쪽 - 오른쪽 맞춤, 아이콘 오른쪽 텍스트). 더 복잡한 경우에 대한 치료는 SwingUtilities.layoutCompoundLabel에 대한 소스 코드를 참조하십시오.

+0

감사합니다 - 이것은 매우 유용한 예제 코드입니다! 그래서 기본적으로 paintCheckBoxBackground 코드는 텍스트와 체크 마크 아이콘을 모두 그리는 역할을합니까? – mikera

+1

@mikera 배경 그림. UI Delegate ('SynthCheckBoxUI', 텍스트 페인팅 코드는'SynthButtonUI','paint (SynthContext context, Graphics g)')는 텍스트와 아이콘 자체를 페인팅합니다. – Taisin

+0

위대한, 지금 완벽하게 작동합니다 - 많은 도움을 주셔서 감사합니다 !! – mikera