gpt4 book ai didi

java - getListCellRendererComponent 调用了多少次?

转载 作者:行者123 更新时间:2023-12-04 05:39:30 25 4
gpt4 key购买 nike

我试图了解 getListCellRendererComponent 方法的工作原理,但我不明白。我创建了一个扩展 BasicComboBoxRenderer 的单独类,并添加了一个计数器,每次调用 getListCellRendererComponent 时都会打印该计数器。然后,我使用 main 方法运行一个测试类,该方法显示一个只有一个 JComboBox 的框架,该 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 时,它都需要渲染以前未在屏幕上显示的任何项目,这是出于优化的原因(假设 lst 有 100 个项目,渲染所有项目是浪费时间,因此包含原型(prototype)值)

    鼠标 Action 可以触发一系列不同的 Action ,鼠标移入、鼠标移出、鼠标移动。这些很可能与工具提示管理器和组件有关,试图确定工具提示是否可用

    尝试设置原型(prototype)值并查看组件显示其弹出窗口时是否会更改迭代次数

    关于java - getListCellRendererComponent 调用了多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440383/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com