2011-11-21 7 views
4

상호 교환 가능한 스킨 구성 요소가있는 JButton 사용자 정의를 만들려고합니다. CardLayout을 전환 메커니즘으로 사용하여 JButton에 걸쳐 플러시 된 JComponent (즉, 스킨 구성 요소)에 문제가 있습니다. 예를 들어JButton의 교환 가능한 JComponent 스킨


,

enter image description here

정말 원유 예입니다

import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public final class SkinsDemo { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI(){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new FlowLayout()); 
     frame.add(new JSkinnableButton()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static final class JSkinnableButton extends JButton{ 
     private static final long serialVersionUID = -5167346969674067012L; 

     protected JSkinnableButton(){ 
      super(); 
      setLayout(new CardLayout()); // for interchangeability 
      add(new JSkinComponent(), "Skin"); 
     } 
    } 

    private static final class JSkinComponent extends JComponent{ 
     private static final long serialVersionUID = 2172542865655802012L; 

     protected JSkinComponent(){ 
      super(); 
      setOpaque(true); 
      setLayout(new FlowLayout()); // need layout manager 
      setBackground(Color.CYAN); 
      add(new JLabel("Skin")); 
     } 

     @Override 
     protected void paintComponent(Graphics g){ 
      Graphics gCopy = g.create(); 
      gCopy.setColor(getBackground()); 
      gCopy.fillRect(0, 0, getWidth(), getHeight()); 
      gCopy.dispose(); 
     } 
    } 
} 

,하지만 난 그것을 명확하게 내 의도를 전달 생각합니다.

그리고이 JButton은 도메인 개체에서 속성 변경 이벤트를 수신하고 이에 따라 디스플레이를 업데이트합니다.

+0

, '1)'LayoutManager,'3)'을 사용하여 Color.CYAN 전체 JButton'2)'를 채우고 싶습니까? JButton Events에 피부가 얼마나 의존합니까? – mKorbel

+0

@mKorbel,'JComponent'의 배경을'JButton' 전체를 채우기를 원하고'CardLayout' 관리자를 사용하여 3 가지 스킨 사이를 쉽게 전환 할 수 있기를 원합니다.이 스킨은 'PropertyChangeEvent '. – mre

+0

'Icon' 또는 덜 편리하게'ButtonUI'를 변경하지 않는 이유는 무엇입니까? – trashgod

답변

2

버튼의 여백과 테두리로 인해 JSkinnableButton에 공간이 차지합니다.

protected JSkinnableButton(){ 
    super(); 
    setLayout(new CardLayout()); // for interchangeability 
    setMargin(new Insets(0,0,0,0)); 
    setBorder(BorderFactory.createEmptyBorder()); 
    add(new JSkinComponent(), "Skin"); 
} 

지금, 특히 테두리, 버튼은 버튼처럼 보이게 무엇의 일부입니다,하지만 난 당신이 이미 계획을 가지고 가정 ... 끝에서 다시