我试图了解 getListCellRendererComponent 方法的工作原理,但我不明白。我创建了一个扩展 BasicComboBoxRenderer 的单独类,并添加了一个计数器,每次调用 getListCellRendererComponent 时都会打印该计数器。然后,我使用 main 方法运行一个测试类,该方法显示一个仅包含使用我的自定义渲染器类的 JComboBox 的框架。这个组合框总共有 3 个项目,我设置了 setMaximumRowCount(2),所以它只显示其中的 2 个。
- 当我第一次运行程序并且出现带有组合框的框架时,计数器通知 getListCellRendererComponent 被调用了 6 次。
- 当框架失去焦点时(例如,当我单击桌面时),该方法会执行 1 次。
- 当框架重新获得焦点(单击回我的框架)时,该方法将执行 1 次。
- 当我单击箭头按钮并且第一次出现下拉列表时,计数器显示该方法执行了 8 次。
- 当我再次单击箭头按钮且列表消失时,该方法会被调用 1 次(这种情况总是会发生)。
- 当我第一次点击箭头按钮时,该方法被调用 5 次。
- 当我点击滚动条按钮向上或向下时,该方法执行1次。
- 当我将光标移动到列表中未选中的项目上时,该方法执行 2 次,一秒后又执行 1 次(这是最荒谬的)
- 当我单击列表中的某个项目时,该方法会执行 4 次。
一开始我以为这个方法会执行与列表中的项目数一样多的次数(再加上组合框显示区域中出现的项目数)。
但是我只能从上面理解一两种情况,例如当我单击滚动条按钮并且该方法执行1次时,可能是因为渲染了一个新项目。其余的人看起来都疯了......
最佳答案
我希望在任何时候调用渲染器的次数不少于 n + 1 次。
该组件需要
- 找出内容的最佳尺寸。这可以通过使用原型(prototype)值来实现,或者如果没有指定,则迭代所有项目以找到最大边界(即 3 次)
- 渲染所选项目(如果存在)+1 次
- 如果弹出窗口可见 +3 次,则渲染列表
- 可能会寻找工具提示
= 可能的 7 次迭代
失去焦点时,组件需要渲染所选项目+1
当重新获得焦点时,组件将再次尝试渲染所选项目+1
当弹出窗口显示时,请参阅第一部分
第二次可能表明组件已缓存第一个弹出操作的结果(组件可能在焦点事件之间使其内部缓存失效)
每次更改滚动 Pane 的 View 时,它都需要渲染以前未在屏幕上显示的任何项目,这是出于优化原因而完成的(想象一下具有 100 个项目的 lst,渲染所有这些项目是浪费时间,因此包含原型(prototype)值)
鼠标操作可以触发一系列不同的操作,鼠标移入、鼠标移出、鼠标移动。这些很可能与工具提示管理器和组件尝试确定工具提示是否可用有关
尝试设置原型(prototype)值并查看组件显示弹出窗口时是否会改变迭代次数
关于java - getListCellRendererComponent 被调用了多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440383/