日期:2014-05-20  浏览次数:20832 次

怎样改变Jcheckbox 中对号的颜色
怎样改变Jcheckbox 中对号的颜色

------解决方案--------------------
楼主指的是复选框中的那个“勾”么?
复选框前面的方框其实是图片
用以下几个方法就可以把其各个状态换成你喜欢的图片
setIcon();
setPressedIcon();
setRolloverIcon();
setSelectedIcon();
setRolloverSelectedIcon();

如果想使用 MetalLookAndFeel 的默认的图标,
却仅仅只想改变其中那个“勾”的颜色的话
貌似是做不到的
因为 MetalLookAndFeel 没有把这个“勾”的颜色做一个专门的键值
在那个默认图片进行绘制“勾”的时候调用的是这个方法设的颜色:
MetalLookAndFeel.getControlInfo()
最终可以看到返回的是 -- 黑色,而这个方法是一个静态方法

因此,没有可以直接修改这个“勾”颜色的API
你只能替换图片
或者换一种L&F
------解决方案--------------------
延续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( 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 ) ;
}
}

}