积微成著 不积跬步,无以至千里

首页   >   web开发   >   JComboBox的第三次优化图文教程

JComboBox的第三次优化图文教程

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

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的第三次优化图文教程

QQ群:积微成著官方群(686430774),验证消息:积微成著

站长Q:1347384268(加好友请注明来意)

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2017-11-15

永久地址:http://www.jiweichengzhu.com/article/7308fa7427c6403e9b673dcc83c7b55d