4
상호 교환 가능한 스킨 구성 요소가있는 JButton
사용자 정의를 만들려고합니다. CardLayout
을 전환 메커니즘으로 사용하여 JButton
에 걸쳐 플러시 된 JComponent
(즉, 스킨 구성 요소)에 문제가 있습니다. 예를 들어JButton의 교환 가능한 JComponent 스킨
,
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
은 도메인 개체에서 속성 변경 이벤트를 수신하고 이에 따라 디스플레이를 업데이트합니다.
, '1)'LayoutManager,'3)'을 사용하여 Color.CYAN 전체 JButton'2)'를 채우고 싶습니까? JButton Events에 피부가 얼마나 의존합니까? – mKorbel
@mKorbel,'JComponent'의 배경을'JButton' 전체를 채우기를 원하고'CardLayout' 관리자를 사용하여 3 가지 스킨 사이를 쉽게 전환 할 수 있기를 원합니다.이 스킨은 'PropertyChangeEvent '. – mre
'Icon' 또는 덜 편리하게'ButtonUI'를 변경하지 않는 이유는 무엇입니까? – trashgod