为何BasicComboBoxRenderer在getPreferredSize()中对空文本两次设置文本?
关于BasicComboBoxRenderer中getPreferredSize处理空文本的原因
先看你贴出的这段代码:
public Dimension getPreferredSize() { Dimension size; if (this.getText() == null || this.getText().isEmpty()) { setText( " " ); size = super.getPreferredSize(); setText( "" ); } else { size = super.getPreferredSize(); } return size; }
为什么不在构造函数初始化?
ComboBox的渲染器是复用实例的,不是每个下拉条目都创建一个新的BasicComboBoxRenderer对象。构造函数只会在渲染器第一次创建时执行一次,但后续下拉列表切换不同条目时,渲染器会被重新设置文本(包括空文本的情况),构造函数的初始化没法覆盖这些动态变化的场景,所以在构造函数里设默认文本完全没用。
为什么要在getPreferredSize里处理?
JLabel的默认行为是:如果文本为空或null,getPreferredSize()会返回一个极小的尺寸(宽高几乎为0)。如果ComboBox里有空文本的条目,直接用这个尺寸的话,下拉列表里的空条目会缩成一条细线,和其他有文本的条目行高不一致,视觉上非常不协调。
这段代码的逻辑是临时把空文本替换成空格,让JLabel计算出正常的行高尺寸,然后再把文本改回空。这样返回的尺寸就能保证空条目和非空条目有一样的高度,下拉列表的行高统一,用户体验更好。
内容的提问来源于stack exchange,提问作者Makore
相关产品推荐
相关产品推荐

