在运行时更改 JList 行颜色
我正在尝试动态更改 JList 行。我需要更改第 n 行颜色,突出显示它(n 在编译期间未知)。我看到很多使用自定义 ListCellRenderer 的示例,但都是“静态”的。
换句话说,我有 x 行的 JList。在运行时,我的“业务逻辑”检测到第 n 行很重要。所以我想将其背景设为绿色,等待一秒钟,然后再次将其设为白色。还有一件事,不要更改行选择。
最好的方法是什么?
I am trying to change JList rows dynamically. I need change nth row colour, highlight it(n is unknown during compilation). I saw a lot of examples with custom ListCellRenderer, but all were "static".
In other words I have JList with x rows. During runtime my "business logic" detects nth row is important. So I want make its background green, wait one second, and then make it white again. One more thing, don't wan change row selection.
What is the best way to do so?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
很简单,使用以下方法将自定义 ListCellRenderer 设置为您的 JList:
现在在重写的方法 getListCellRendererComponent() 中执行如下操作:
上面的示例假设您的自定义渲染器重写了 DefaultListCellRenderer
Simple, set a custom ListCellRenderer to your JList using:
Now inside the overridden method getListCellRendererComponent() do something like this:
The above example assumed that your custom renderer overrid DefaultListCellRenderer
基于 SUN 的 ListDemo 示例。
如果您在文本字段中输入一些不在列表中的文本,并且单击突出显示,则会添加该文本。
如果文本位于列表中并且您点击突出显示,则列表中的条目会暂时突出显示为蓝色。
请注意,此处带有匹配字段的解决方案仅用于演示。为了更正确的实现,请考虑提出的其他想法并考虑使用 javax.swing.Timer
Based on ListDemo sample from SUN.
If you enter some text in the textfield which isn't in the list and you hit highlight it gets added.
If the text is in the list and you hit highlight the entry in the list gets temporarily highlighted blue.
Note the solution here with the match field is just for demo. For more correct implementation consider the other ideas proposed and consider using
javax.swing.Timer
您的自定义 ListCellRenderer 实现了 getListCellRendererComponent 方法,它将可以访问 JList 及其正在重新渲染的值。这为您提供了几个选项,用于确定何时将第 n 行绘制为绿色:
JList
子类可以触发重绘,然后启动 SwingTimer
触发重绘,返回bg 恢复正常getListCellRendererComponent
中测试它的状态,如果状态正确,则将背景设置为绿色。同样,您可以选择设置 SwingTimer
来恢复支持对象的状态。Your custom ListCellRenderer, which implements the method
getListCellRendererComponent
, will have access to both theJList
and the value that it is redering. This gives you a couple options for how to determine when to paint the nth row green:JList
and have the renderer ask it which color to use for the bg. TheJList
subclass could trigger a repaint when the business logic determines that it is time for the nth row to be green, and then start an SwingTimer
to trigger a repaint returning the bg back to normalgetListCellRendererComponent
, setting the bg green if the state is correct. Again, you have the option of setting an SwingTimer
to revert the state on the backing object.