您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发
【原】JComboBox的第二次优化图文教程
不忘初心 2017-11-15 围观() 评论() 点赞() 附件(1) 【JAVA开发】
简介:上次优化的时候,遗漏了一个点,在下拉项很多的时候,那个很丑的原生滚动条又蹦出来作妖了,当时写教程的时候,只放了三个下拉项,没有呈现出来这个问题。真的是丑炸天,问
上次优化的时候,遗漏了一个点,在下拉项很多的时候,那个很丑的原生滚动条又蹦出来作妖了,当时写教程的时候,只放了三个下拉项,没有呈现出来这个问题。
真的是丑炸天,问题知道了,那就来看一下,其实也很简单,之前也有讲过 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优化中已经给出了,这里就不再给了,直接来一张效果图:
看完文章,有任何疑问,请加入群聊一起交流!!!
很赞哦! ()
相关文章
标签云
猜你喜欢
- IntelliJ IDEA 2019.2已经可以利用补丁永久破解激活了
- IntelliJ IDEA 2019.3利用补丁永久破解激活教程
- IntelliJ IDEA高版本最灵活的永久破解激活方法(含插件激活,时长你说了算)
- Jetbrains全家桶基于ja-netfilter的最新破解激活详细图文教程
- IntelliJ IDEA 2022.1永久破解激活教程(亲测可用,持续更新)
- 分享几个正版 IntelliJ IDEA 激活码(破解码、注册码),亲测可用,持续更新
- ja-netfilter到底需不需要mymap,2021.3.2版本激活失效?
- 如何激活idea2022.1及以上版本中的插件(亲测可用)
- 【史上最全】IntelliJ IDEA最新2022.1版本安装和激活视频教学(含插件)
- IntelliJ IDEA 2022.2 版本最新2099年永久激活方法,亲测可用,也可以开启新UI了。
站点信息
- 网站程序:spring + freemarker
- 主题模板:《今夕何夕》
- 文章统计:篇文章
- 标签管理:标签云
- 微信公众号:扫描二维码,关注我们