gpt4 book ai didi

java - 如何创建可感知外观的 TableCellRenderer?

转载 作者:行者123 更新时间:2023-11-30 11:11:50 25 4
gpt4 key购买 nike

我能找到的所有自定义示例 TableCellRenderer似乎都在扩展DefaultTableCellRenderer .我想这没什么不妥,除了您无法扩展当前外观的 TableCellRenderer 功能。这不好。您的 TableCellRenderer 将无法识别 L&F。

这正是我想要做的:我想创建一个自定义的TableCellRenderer,它是 L&F 感知的,所以与其扩展 DefaultTableCellRenderer,不如扩展(或decorate) L&F 为给定类类型默认安装的 TableCellRenderer 是什么。

我可以通过 myJTable.getDefaultRenderer(...) 来实现但这不会给我该类的新实例,它只会返回 L&F 的“主”表格单元格渲染器以用于该类型的类。我从一个创建自定义 TableCellRenderer 的解决方案开始,该解决方案包装了我从上述方法(有效地使用装饰器模式)获得的实例,直到我意识到我没有自己的渲染器私有(private)实例。如果我弄乱了渲染器的那个实例,我就无法进行特定于列的渲染,因为我对该实例所做的任何更改都会影响比预期更多的列。

因此我得出结论,我需要做的是为该类类型创建 L&F 的 TableCellRenderer 的全新实例。 (在我的例子中,class type = Object)。我相信我可以从 UIManager 中的某处获取相关的类名,但我不知道该使用哪个键。其次 - 不幸的是 - 我相信我必须使用反射来实际实例化该 TableCellRenderer 类的对象。

我的假设是否正确,即不幸的是没有 TableCellRenderer 工厂?以及我实际上如何为类类型 Object 实例化当前 L&F 的 TableCellRenderer 的新实例? (我知道如何使用反射,如果那是唯一的方法的话)

更新

您可能已经猜到,我正在使用专有 L&F 和标准 L&F 进行测试。这个特别专有的 L&F 安装了自己的 TableCellRenderer,这是完全合法的,IMO。 Java Synth L&F 也是如此。所以我不想将其作为特定 L&F 的问题。

测试:我创建了一个包含两个 String 列的表。我在其中一列上安装了自己的自定义单元格渲染器,但在另一列上没有安装。我的自定义渲染器如下所示:

public class CustomCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}

如您所见,自定义渲染器什么也不做。因为它什么都不做,所以我应该在两个表列上获得相同的渲染效果。我不!原因当然是通过简单地扩展 DefaultTableCellRenderer 我不会“继承”L&F 自己的 TableCellRenderer 应该有一个/一些。在很多很多 L&F 上,上述测试实际上会以相同的方式呈现两列,但这更多是偶然的。我想以正确的方式做事。扩展 DefaultTableCellRenderer 对大多数 L&F 产生预期结果这一事实对我来说还不够。 :-)

最佳答案

我们这样解决了这个问题:

public class CustomCellRenderer  implements TableCellRenderer {
//Use appropriate class here
private final TableCellRenderer defaultTableCellRenderer= new JTable().getDefaultRenderer(Object.class);
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component c = defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
// do custom stuff to c here ...
return c;
}
}

如果您不为 TableCellRenderer 创建一个新实例,您会得到奇怪的效果,因为您更改了表的默认实例。

关于java - 如何创建可感知外观的 TableCellRenderer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27226232/

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