问题标签 [listcellrenderer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
662 浏览

java - ListCellRenderer 中的 ImageIcon 缓慢

我有一个class GridPanel extends JPanel, 带有一个静态内部类ToolSelectComboBox extends JComboBox,它又具有两个静态内部类ToolSelectComboBoxModel implements ComboBoxModelToolSelectComboBoxRenderer implements ListCellRenderer. 面板显示ToolSelectComboBox(TSCB),其构造函数将其模型和渲染器设置为我创建的自定义渲染器。盒子创建正确,其模型和渲染器工作正常。

但是,渲染器的getListCellRendererComponent(...)方法在它返回ImageIcon的那个上使用了一个。JLabel该图标已正确加载,但是,当我第一次单击组合框(每次运行时)时,图像的加载时间恰好(或至少非常接近)一秒多一点。我会假设这是加载文件的一些滞后,除了

  • 这是我本地文件系统上的一个 4kB 文件
  • 当我在System.out.println命令之前和之后添加命令时result.setIcon(...),它们几乎立即相互跟随。

我注意到的奇怪的事情是println命令被触发了两次,一次是在我单击框时,一次是在图标加载时。

还可能值得注意的是,由于它旨在与覆盖父抽象类的单个方法的多个类一起使用(以生成图标的路径),当我注意到它工作缓慢时,我将代码从只需使用getIcon命令检索图标以将各种大小的图标(16、32 和 64 px 平方)存储在一个TreeMap<Tool.ImageSize, ImageIcon>Tool我创建的具有ImageIcon getIcon()方法的界面在哪里。

我所有的进口都井井有条。

任何帮助,将不胜感激!

如果我发布了太多代码,我深表歉意,但我想确保它是可以理解的。另一方面,如果您需要更多代码才能理解,请不要犹豫。

代码(所有以“”开头*并具有类似注释的文本的行都是折叠的 JavaDoc 标记,而不仅仅是混乱的代码):

该类CircleTool只有一个方法(覆盖AbstractTool的抽象方法以获取图像路径),并且由于该方法有效(它可以很好地获取路径,它只是加载缓慢的图标),因此我没有包含此类。

AbstractTool班级:

0 投票
1 回答
3023 浏览

java - 带有可切换组标题的 JList

是否可以在 Java 中执行类似下图的操作?

我知道我需要使用带有自定义单元格渲染器的多列列表,才能显示每个列表元素的图像。但我的问题是关于对列表元素进行分组和使用组标题...

分组列表视图的图像

从上图中可以看出,它来自 Windows 资源管理器,并且正是我希望在 Java 中使用 JList 的分组列表视图的类型。

0 投票
3 回答
7620 浏览

java - 自定义 ListCellRenderer 不会改变背景颜色

我有这堂课:

问题是当我在 JList 中选择一个单元格时,我的背景不会变成红色。setText 部分有效,但我不知道为什么它不会改变单元格的背景颜色。大家有什么想法,谢谢!

0 投票
3 回答
1537 浏览

java - 多个 ListCellRenderer

一个类中是否可以有多个 ListCellRenderer 的实现?

实际上,我的应用程序中有多个 JList,我需要为每个 JList 提供不同的 ListCellRenderer。

我可以有不同的类名来实现 ListCellRenderer 的 Component 方法。

例如:如果我有一个名为“MultiColumnCellRenderer”的类,其中包含一些组件方法的实现,另一个名为“MultiColumnCellRenderer2”的类与其他一些组件方法的实现?

如果我做类似的事情:

它不工作....

我正在为 list1 和 list2 寻找不同的渲染。

我怎样才能做到这一点

0 投票
1 回答
1696 浏览

java - Java:如何更新自定义 ListCellRenderer?

我为我的聊天应用程序实现了自己的 ListCellRenderer。我使用 JList 列出所有用户。单元格渲染器主要由一个图标组成,该图标显示特定用户当前是在线还是离线以及他/她的姓名。该列表由 DefaultListModel 控制,我使用它为 JList 提供必要的信息。

但是当列表模型确实改变了它的状态时(例如用户离线),列表单元渲染器似乎没有被调用?

有人知道如何解决这个问题吗?试图在 JList 实例上调用 updateUI(),但没有帮助。

提前谢谢了!

0 投票
1 回答
1315 浏览

java - 将鼠标监听器添加到 ListCellRenderer 中的 JLabel

我有一个由两个 JLabel 组成的 ListCellRenderer;一个用于文本,一个用于退出图像(一个小十字)。

我想在那个小十字上添加一个鼠标监听器,单击时,该项目将从 JList 中删除。

0 投票
2 回答
17322 浏览

java - Java JList设置项目的颜色

你能帮我吗,如何改变JList中显示的项目的颜色?

我正在制作一个用户 JList,我可以在其中看到在线和离线用户,并且我需要离线用户具有与在线用户不同的颜色。

我创建用户的代码

0 投票
2 回答
1503 浏览

java - Java中JList中JCheckBox检查切换逻辑的问题

嗨,我在切换 JList 中的复选框时遇到问题,我希望在单击某个项目时使复选框打勾,如果再次打勾,我希望它切换为未打勾。我希望可以在不使用 ctrl 或 shift 键的情况下勾选或取消勾选多个项目。

这是我尝试将数据添加到表中的方式,由于某种原因没有出现任何内容,有什么想法吗?

0 投票
1 回答
5272 浏览

java - 如何更改 JComboBox 显示区域的外观

我正在为 JComboBox 使用自定义 BasicComboBoxRenderer,并且更改了下拉列表项目的外观。但是,这些更改也适用于组合框中显示的单个顶部项目(不知道如何调用它)。

如果可能的话,我希望最上面的项目独立于列表中的其他项目。我还想在焦点集中时摆脱顶部项目的蓝色(setFocusable(false) 不是我想要的)。

我尝试使用“渲染器索引”(-1)来影响顶部项目,但它似乎没有帮助。

有任何想法吗?

PS 不幸的是,我无法添加更清晰的图像(没有声誉)。

编辑:当我说我希望顶部项目独立于下拉列表的所有其他项目时,我的意思是总是看起来与其他项目不同。例如,在我的自定义 BasicComboBoxRenderer 中,我将所选项目设置为具有不同的背景,但此背景也适用于顶部项目(因为所选项目成为组合框的顶部项目)。

编辑2:顶部项目=我的意思是组合框显示区域,所以我想影响显示区域中显示的项目,而不是下拉列表中的第一个项目。我设法通过在组合框本身和 setFocusable(false) 上使用 setBackground 来做到这一点(这不是很有帮助,因为我想保持焦点机制)。但问题是(除了焦点问题),例如,如果我通过自定义 BasicComboBoxRenderer 或 ListCellRenderer 类在列表中的每个项目上设置边框,则相同的边框会出现在显示区域中显示的项目上。所以这里有2个问题:

--有什么办法可以区分下拉列表中的item的布局和显示区的单个item的布局吗?

--有没有什么方法可以在不禁用焦点机制的情况下禁用组合框的焦点颜色,就像我们在按钮上使用 setFocusPainted(false) 时一样?(我还尝试在组合框上添加自定义 FocusListener,但通过 focusGained() 对背景所做的任何更改仅影响按钮,而不影响显示区域中显示的项目)。

很抱歉造成混乱和多次编辑......

0 投票
2 回答
3235 浏览

java - getListCellRendererComponent 调用了多少次?

我试图了解 getListCellRendererComponent 方法的工作原理,但我不明白。我创建了一个扩展 BasicComboBoxRenderer 的单独类,并添加了一个计数器,每次调用 getListCellRendererComponent 时都会打印该计数器。然后,我使用 main 方法运行一个测试类,该方法显示一个只有一个 JComboBox 的框架,该 JComboBox 使用我的自定义渲染器类。这个组合框总共有 3 个项目,我设置了 setMaximumRowCount(2) 所以它只显示其中 2 个。

  • 当我第一次运行程序并出现带有组合框的框架时,计数器通知 getListCellRendererComponent 被调用了 6 次。
  • 当框架失去焦点时(例如,当我单击桌面时)该方法执行 1 次。
  • 当框架重新获得焦点(单击我的框架)时,该方法执行 1 次。
  • 当我单击箭头按钮并第一次出现下拉列表时,计数器说该方法执行了 8 次。
  • 当我再次单击箭头按钮并且列表消失时,该方法被调用 1 次(这种情况总是发生)。
  • 当我在第一次之后单击箭头按钮时,该方法被调用了 5 次。
  • 当我单击滚动条按钮向上或向下时,该方法执行 1 次。
  • 当我将光标移动到列表中未选中的项目上时,该方法执行 2 次,然后再执行 1 次(这是最荒谬的)
  • 当我单击列表中的一个项目时,该方法执行 4 次。

一开始我以为这个方法的执行次数与列表中项目的数量一样多(再加上出现在组合框显示区域上的次数)。

但是从上面我只能理解一两种情况,比如当我点击滚动条按钮,方法执行1次时,可能是因为渲染了一个新项目。其他人看起来都疯了……