您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

【原】JComboBox的第二次优化图文教程

不忘初心 不忘初心 2017-11-15 围观() 评论() 点赞() 附件(1) JAVA开发

简介:上次优化的时候,遗漏了一个点,在下拉项很多的时候,那个很丑的原生滚动条又蹦出来作妖了,当时写教程的时候,只放了三个下拉项,没有呈现出来这个问题。真的是丑炸天,问

上次优化的时候,遗漏了一个点,在下拉项很多的时候,那个很丑的原生滚动条又蹦出来作妖了,当时写教程的时候,只放了三个下拉项,没有呈现出来这个问题。

JComboBox的第二次优化图文教程

真的是丑炸天,问题知道了,那就来看一下,其实也很简单,之前也有讲过 JScrollPane的优化,这个其实就是一个JScrollPane,我们将之前优化的UI给他套进去就行了。

这个下拉框的专业术语叫“popup”,在 JCombobox的优化教程 中有提到,当时写了一个MyComboBoxUI类,为了将它的边框颜色统一起来,我们写了这样一段代码

@Override
    protected ComboPopup createPopup() {
        BasicComboPopup popup = (BasicComboPopup) super.createPopup();
        //MyComboPopup popup = new MyComboPopup(comboBox);
        // 获取到popup,为其设置边框,和combobox的颜色保持同步
        popup.setBorder(BorderFactory.createLineBorder(DEFAULT_COLOR));
        return popup;
    }

不得不说,swing的明明规范真的是很棒,一眼看过去就能猜到八九不离十,创建一个popup,那我们就可以从这里下手了。

既然给我们返回的是一个BasicComboPopup,那我们就去这个类中看看有哪些代码,优化就要针对这个类下手了

public class BasicComboPopup extends JPopupMenu implements ComboPopup {

	...... // 代码省略

    protected JComboBox                comboBox;
	
    /**
     * This protected field is implementation specific. Do not access directly
     * or override. Use the accessor methods instead.
     *
     * @see #getList
     * @see #createList
     */
    protected JList                    list;
	
    /**
     * This protected field is implementation specific. Do not access directly
     * or override. Use the create method instead
     *
     * @see #createScroller
     */
    protected JScrollPane              scroller;

	...... // 代码省略
	
}

一进来,在最上面就能看到这样三个变量,前两个就不多说了吧,之前讲过了,分别是它对应的combobox和下拉项,看到第三个,是不是就感觉问题就解决了?

那我们就直接在这个类里面搜索一下关于scroller的方法,第一个搜到的就是BasicComboPopup构造方法

//===================================================================
// begin Initialization routines

public BasicComboPopup( JComboBox combo ) {
	super();
	setName("ComboPopup.popup");
	comboBox = combo;

	setLightWeightPopupEnabled( comboBox.isLightWeightPopupEnabled() );

	// UI construction of the popup.
	list = createList();
	list.setName("ComboBox.list");
	configureList();
	scroller = createScroller();
	scroller.setName("ComboBox.scrollPane");
	configureScroller();
	configurePopup();

	installComboBoxListeners();
	installKeyboardActions();
}

我们可以看到,scroller是由一个createScroller()方法来创建的,那我们就继续看一下这个方法

/**
 * Creates the scroll pane which houses the scrollable list.
 */
protected JScrollPane createScroller() {
	JScrollPane sp = new JScrollPane( list,
							ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
							ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
	sp.setHorizontalScrollBar(null);
	return sp;
}

很简有木有?他也没做什么特殊的操作,直接new了一个JScrollPane出来,那我们就将它这个创建的JScrollPane给改了就行了。

怎么简单怎么来,直接写一个类,继承BasicComboPopup,重写createScroller方法

// 继承,主要是为了改变滚动条的UI
class MyComboPopup extends BasicComboPopup {

	MyComboPopup(JComboBox combo) {
		super(combo);
	}

	@Override
	protected JScrollPane createScroller() {
		JScrollPane jScrollPane =  super.createScroller();
		jScrollPane.setHorizontalScrollBar(null);// 无横向滚动条
		jScrollPane.getVerticalScrollBar().setUI(new MyScrollBarUI());// 设置我们自己的UI
		return jScrollPane;
	}
}

我们将MyComboBoxUI.java代码中的createPopup()方法更改一下,获取我们自己重写的那个popup即可

@Override
protected ComboPopup createPopup() {
	//BasicComboPopup popup = (BasicComboPopup) super.createPopup();
	MyComboPopup popup = new MyComboPopup(comboBox);
	// 获取到popup,为其设置边框,和combobox的颜色保持同步
	popup.setBorder(BorderFactory.createLineBorder(DEFAULT_COLOR));
	return popup;
}

MyScrollBarUI.java,在之前的JScrollPane优化中已经给出了,这里就不再给了,直接来一张效果图:

JComboBox的第二次优化图文教程

javaswingjcombobox

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们