延续3楼的思路,不过别整什么图片,直接用icon,覆盖paintIcon方法即可,下面有一个例子,不过做的不精细public class ColorCheckBox extends JCheckBox{ /** * 序列号 */ private static final long serialVersionUID = -9169497310843186720L ; /** * 构造方法 * @param text * @param color */ public ColorCheckBox( String text , Color color ){ super( text ) ; setIcon( new CheckBoxIcon( color ) ) ; } private static class CheckBoxIcon implements Icon{ /** * 序列号 */ private static final long serialVersionUID = -8237596219671909041L ; /** * 尺寸 */ private final static int csize = 13 ;
/** * 背景颜色 */ private Color background ;
/** * 构造方法 * @param color */ private CheckBoxIcon( Color color ){ background = color ; } @Override public void paintIcon( Component c , Graphics g , int x , int y ){ AbstractButton b = ( AbstractButton )c ; ButtonModel model = b.getModel() ; boolean isSelected = model.isSelected() ; boolean isRollover = model.isRollover() ;
if( isSelected ){ drawCheckIn( g , x , y ) ; } } @Override public int getIconWidth(){ return csize ; } @Override public int getIconHeight(){ return csize ; }
复选框前面的方框其实是图片
用以下几个方法就可以把其各个状态换成你喜欢的图片
setIcon();
setPressedIcon();
setRolloverIcon();
setSelectedIcon();
setRolloverSelectedIcon();如果想使用 MetalLookAndFeel 的默认的图标,
却仅仅只想改变其中那个“勾”的颜色的话
貌似是做不到的
因为 MetalLookAndFeel 没有把这个“勾”的颜色做一个专门的键值
在那个默认图片进行绘制“勾”的时候调用的是这个方法设的颜色:
MetalLookAndFeel.getControlInfo()
最终可以看到返回的是 -- 黑色,而这个方法是一个静态方法因此,没有可以直接修改这个“勾”颜色的API
你只能替换图片
或者换一种L&F
* 序列号
*/
private static final long serialVersionUID = -9169497310843186720L ; /**
* 构造方法
* @param text
* @param color
*/
public ColorCheckBox( String text , Color color ){
super( text ) ;
setIcon( new CheckBoxIcon( color ) ) ;
} private static class CheckBoxIcon implements Icon{
/**
* 序列号
*/
private static final long serialVersionUID = -8237596219671909041L ; /**
* 尺寸
*/
private final static int csize = 13 ;
/**
* 背景颜色
*/
private Color background ;
/**
* 构造方法
* @param color
*/
private CheckBoxIcon( Color color ){
background = color ;
} @Override
public void paintIcon( Component c , Graphics g , int x , int y ){
AbstractButton b = ( AbstractButton )c ;
ButtonModel model = b.getModel() ; boolean isSelected = model.isSelected() ;
boolean isRollover = model.isRollover() ;
if( isRollover ){
g.setColor( Color.GRAY ) ;
}
else{
g.setColor( Color.BLACK ) ;
}
g.drawRect( x , y , csize - 1 , csize - 1 ) ;
g.setColor( background ) ;
g.fillRect( x + 1 , y + 1 , csize - 2 , csize - 2 ) ;
if( isSelected ){
drawCheckIn( g , x , y ) ;
}
} @Override
public int getIconWidth(){
return csize ;
} @Override
public int getIconHeight(){
return csize ;
}
/**
* 画对钩
* @param g
*/
private void drawCheckIn( Graphics g , int x , int y ){
g.setColor( Color.BLACK ) ;
g.translate( x , y ) ;
g.drawLine( csize - 2 , 1 , csize - 2 , 2 ) ;
g.drawLine( csize - 3 , 2 , csize - 3 , 3 ) ;
g.drawLine( csize - 4 , 3 , csize - 4 , 4 ) ;
g.drawLine( csize - 5 , 4 , csize - 5 , 6 ) ;
g.drawLine( csize - 6 , 5 , csize - 6 , 8 ) ;
g.drawLine( csize - 7 , 6 , csize - 7 , 10 ) ;
g.drawLine( csize - 8 , 7 , csize - 8 , 10 ) ;
g.drawLine( csize - 9 , 6 , csize - 9 , 9 ) ;
g.drawLine( csize - 10 , 5 , csize - 10 , 8 ) ;
g.drawLine( csize - 11 , 5 , csize - 11 , 7 ) ;
g.drawLine( csize - 12 , 6 , csize - 12 , 6 ) ;
g.translate( -x , -y ) ;
}
}}