首页>代码>Java Swing界面优化JComboBox教程>/course/src/com/wolffy/ui/MyComboBoxUI.java
package com.wolffy.ui;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;

/**
 * Created by Felix on 2019/05/30.
 */
public class MyComboBoxUI extends BasicComboBoxUI {

    private ImageIcon DOWN_ICON = new ImageIcon(getClass().getClassLoader().getResource("down.png"));

    private static Color DEFAULT_COLOR = new Color(150, 207, 254);

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);

        JComboBox comboBox = (JComboBox) c;
        comboBox.setFocusable(true);
        comboBox.setOpaque(false);

        comboBox.setRenderer(new MyListCellRenderer());
    }

    @Override
    protected JButton createArrowButton() {
        // 也可以使用BasicComboBoxUI里的arrowButton对象
        JButton arrow = new JButton();
        // 设置自己定义的UI
        arrow.setUI(new MyButtonUI());
        // 设置图标
        arrow.setIcon(DOWN_ICON);
        // 设置无法获得焦点
        arrow.setFocusable(false);
        // 设置边距,调整图标位置
        arrow.setMargin(new Insets(0, 20, 0, 0));
        return arrow;
    }

    @Override
    public void paint(Graphics g, JComponent c) {

        // 也可以使用BasicComboBoxUI里的combobox对象
        JComboBox comboBox = (JComboBox) c;

        hasFocus = comboBox.hasFocus();

        Rectangle r = rectangleForCurrentValue();

        // JComboBox的textfield的绘制,并不是靠Renderer来控制
        // 它会通过paintCurrentValueBackground来绘制背景
        // 然后通过paintCurrentValue去绘制显示的值
        Graphics2D g2d = (Graphics2D) g;
        if (!comboBox.isEditable()) {
            paintCurrentValueBackground(g2d, r, hasFocus);
            paintCurrentValue(g2d, r, hasFocus);
        } else {
            paintCurrentValueBackground(g2d, r, hasFocus);
        }

        // 获取焦点时,用不同颜色来区分
        if (comboBox.hasFocus()) {
            g2d.setColor(DEFAULT_COLOR);
        } else {
            g2d.setColor(Color.GRAY);
        }

        // 边框透明度
        //g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));

        // 绘制边框,后两个参数控制圆角
        // 边框也有占位,所以宽高都需要减去2,否则会导致边框不全
        g2d.drawRoundRect(0, 0, comboBox.getWidth() - 2, comboBox.getHeight() - 2, 2, 2);
    }

    @Override
    protected ComboPopup createPopup() {
        BasicComboPopup popup = (BasicComboPopup) super.createPopup();
        // 获取到popup,为其设置边框,和combobox的颜色保持同步
        popup.setBorder(BorderFactory.createLineBorder(DEFAULT_COLOR));
        return popup;
    }
}
最近下载更多
李四李四李四  LV1 2023年4月12日
闭回路h  LV1 2023年4月9日
yeyuantao  LV6 2023年3月1日
香菇肉饼汤  LV8 2022年11月22日
ninininini  LV2 2022年7月1日
banliyoo  LV2 2021年9月15日
王志明  LV2 2020年3月18日
cheung666  LV1 2020年1月15日
s962707467  LV1 2019年12月8日
rp2wxl  LV1 2019年9月15日
最近浏览更多
漫步的海星  LV4 2023年8月25日
dsuccess 2023年7月5日
暂无贡献等级
李四李四李四  LV1 2023年4月12日
闭回路h  LV1 2023年4月9日
yeyuantao  LV6 2023年3月1日
yohohero  LV1 2023年1月15日
ninininini  LV2 2022年7月1日
xiao小果  LV13 2022年5月25日
喃喵xxxx  LV6 2022年5月13日
liys1234  LV9 2022年4月22日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友