gpt4 book ai didi

java - Java中的TableModel : how to specify different renderers for different rows?

转载 作者:行者123 更新时间:2023-12-01 14:29:29 25 4
gpt4 key购买 nike

我正在为一个项目使用AbstractTableModel制作一个自定义TableModel,并且我需要找到一种方法让复选框显示在某些行上,而不是其他行上。我已经实现了 getColumn 方法,但我希望能够不显示复选框,除非达到另一列中的特定条件(例如,如果特定行表示的对象是灯泡而不是,比如说, toastr ,为用户提供一个复选框来打开或关闭灯)。

我尝试使用 getValueAt 并传递 null 或字符串而不是 boolean 对象,希望 Swing 不会呈现该复选框。事实并非如此,但它还会因尝试将字符串转换为 boolean 值而引发一组令人讨厌的 ClassCastException。

有人对我如何做这样的事情有任何想法吗?

最佳答案

Swing JTable 中的列是使用单元格渲染器显示的。您应该阅读How to Use Tables Java 教程中有一节描述了该机制的工作原理。这是自定义单元格渲染器的核心方法:

public Component getTableCellRendererComponent(JTable table, Object color,
boolean isSelected, boolean hasFocus,
int row, int column) {

此方法的任务是为框架将在其上使用绘制的特定行和列选择并准备一个组件(通过设置所需的颜色、字体、图像...) 图形上下文。有一个 DefaultTableCellRenderer 可以在没有太多自定义代码的情况下完成此任务(请参阅教程)。请注意,此呈现机制是 Swing 开发人员选择的优化。

您还可以在 Swing Hacks 中了解有关自定义 Swing 组件的更多信息。 。这些示例并不是经过精心设计的代码,只是展示了如何创造性地使用 Swing API。

祝你好运!

示例(见评论):

    final JTable orderTable = new JTable(dataModel);
// All columns with class Boolean are renderered with MyFancyItemRenderer
orderTable.setDefaultRenderer(Boolean.class, new MyFancyItemRenderer());

// Setting the cell renderers explicitly for each column
final TableColumnModel columnModel = orderTable.getColumnModel();

final TableColumn itemCountColumn = columnModel.getColumn(ITEM_COUNT);
itemCountColumn.setCellRenderer(new MyFancyItemRenderer());

// ...

final TableColumn sumColumn = columnModel.getColumn(SUM);
sumColumn.setCellRenderer(new MyFancyPriceRenderer());

关于java - Java中的TableModel : how to specify different renderers for different rows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16946109/

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