怎样改变Jcheckbox 中对号的颜色

解决方案 »

  1.   

    自己写一个 UI类,继承 BasicCheckBoxUI
      

  2.   

    楼主指的是复选框中的那个“勾”么?
    复选框前面的方框其实是图片
    用以下几个方法就可以把其各个状态换成你喜欢的图片
    setIcon();
    setPressedIcon();
    setRolloverIcon();
    setSelectedIcon();
    setRolloverSelectedIcon();如果想使用 MetalLookAndFeel 的默认的图标,
    却仅仅只想改变其中那个“勾”的颜色的话
    貌似是做不到的
    因为 MetalLookAndFeel 没有把这个“勾”的颜色做一个专门的键值
    在那个默认图片进行绘制“勾”的时候调用的是这个方法设的颜色:
    MetalLookAndFeel.getControlInfo()
    最终可以看到返回的是 -- 黑色,而这个方法是一个静态方法因此,没有可以直接修改这个“勾”颜色的API
    你只能替换图片
    或者换一种L&F
      

  3.   

    延续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 ) ;
    }
    }}