Java实现一种个性化的CheckBox

package com.han;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.Icon;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicHTML;
import javax.swing.plaf.metal.MetalCheckBoxUI;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.text.View;

import sun.swing.SwingUtilities2;

/**
 * 实现一种个性化的CheckBox
 * @author HAN
 *
 */
public class CheckBoxCustomized extends JDialog {

    /**
	 * 
	 */
	private static final long serialVersionUID = 5925267340818484608L;

	/**
     * Launch the application
     * @param args
     */
    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    CheckBoxCustomized dialog = new CheckBoxCustomized();
                    dialog.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                            System.exit(0);
                        }
                    });
                    dialog.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the dialog
     */
    public CheckBoxCustomized() {
        super();
        getContentPane().setLayout(null);
        setBounds(100, 100, 500, 375);

        final JCheckBox checkBox = new JCheckBox();
        checkBox.setText("New JCheckBox");
        checkBox.setBounds(87, 57, 118, 26);
        getContentPane().add(checkBox);
        //
        MetalCheckBoxUI ui = new MetalCheckBoxUI(){

            public synchronized void paint(Graphics g, JComponent c) {

            	 AbstractButton b = (AbstractButton) c;
                 ButtonModel model = b.getModel();

                 Dimension size = c.getSize();
                 
                 Font f = c.getFont();
                 g.setFont(f);
                 FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f);

                 Rectangle viewRect = new Rectangle(size);
                 Rectangle iconRect = new Rectangle();
                 Rectangle textRect = new Rectangle();

                 Insets i = c.getInsets();
                 viewRect.x += i.left;
                 viewRect.y += i.top;
                 viewRect.width -= (i.right + viewRect.x);
                 viewRect.height -= (i.bottom + viewRect.y);

                 Icon altIcon = b.getIcon();

                 String text = SwingUtilities.layoutCompoundLabel(
                     c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(),
                     b.getVerticalAlignment(), b.getHorizontalAlignment(),
                     b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
                     viewRect, iconRect, textRect, b.getIconTextGap());

                 // fill background
                 if(c.isOpaque()) {
                     g.setColor(b.getBackground());
                     g.fillRect(0,0, size.width, size.height);
                 }


                 // Paint the radio button
                 if(altIcon != null) {

                     if(!model.isEnabled()) {
                         if(model.isSelected()) {
                            altIcon = b.getDisabledSelectedIcon();
                         } else {
                            altIcon = b.getDisabledIcon();
                         }
                     } else if(model.isPressed() && model.isArmed()) {
                         altIcon = b.getPressedIcon();
                         if(altIcon == null) {
                             // Use selected icon
                             altIcon = b.getSelectedIcon();
                         }
                     } else if(model.isSelected()) {
                         if(b.isRolloverEnabled() && model.isRollover()) {
                                 altIcon = b.getRolloverSelectedIcon();
                                 if (altIcon == null) {
                                         altIcon = b.getSelectedIcon();
                                 }
                         } else {
                                 altIcon = b.getSelectedIcon();
                         }
                     } else if(b.isRolloverEnabled() && model.isRollover()) {
                         altIcon = b.getRolloverIcon();
                     }

                     if(altIcon == null) {
                         altIcon = b.getIcon();
                     }

                     altIcon.paintIcon(c, g, iconRect.x, iconRect.y);

                 } else {
                	 System.out.println("here");
                	 // paint the button icon by myself
                	 if (model.isEnabled()) {
                         if (model.isPressed() && model.isArmed()) {
                             g.setColor(MetalLookAndFeel.getControlShadow());
                             g.fillRect(iconRect.x, iconRect.y, 13, 13);
                         }
                         g.setColor(c.getForeground());
                     } else {
                         g.setColor(MetalLookAndFeel.getControlShadow());
                     }

                     if (model.isSelected()) {
                         int controlSize = 13;
                         g.fillRect(iconRect.x + 3, iconRect.y + 5, 2,
                                 controlSize - 8);
                         g.drawLine(iconRect.x + (controlSize - 4),
                                 iconRect.y + 3, iconRect.x + 5, iconRect.y
                                         + (controlSize - 6));
                         g.drawLine(iconRect.x + (controlSize - 4),
                                 iconRect.y + 4, iconRect.x + 5, iconRect.y
                                         + (controlSize - 5));
                     }
                 }


                 // Draw the Text
                 if(text != null) {
                     View v = (View) c.getClientProperty(BasicHTML.propertyKey);
                     if (v != null) {
                         v.paint(g, textRect);
                     } else {
                        int mnemIndex = b.getDisplayedMnemonicIndex();
                        if(model.isEnabled()) {
                            // *** paint the text normally
                            g.setColor(b.getForeground());
                        } else {
                            // *** paint the text disabled
                            g.setColor(getDisabledTextColor());
                        }
                        SwingUtilities2.drawStringUnderlineCharAt(c,g,text,
                                mnemIndex, textRect.x, textRect.y + fm.getAscent());
                    }
                    if(b.hasFocus() && b.isFocusPainted() &&
                       textRect.width > 0 && textRect.height > 0 ) {
                        paintFocus(g,textRect,size);
                    }
                 }
            }
        };
        
        checkBox.setUI(ui);
        System.out.println(checkBox.isFocusPainted());
        checkBox.setFocusPainted(false); // this is optional
        System.out.println();
    }

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值