【问题标题】:JTable with different row types具有不同行类型的 JTable
【发布时间】:2015-01-07 00:36:18
【问题描述】:

我想在我的程序中实现一个JTable,它有多种类型的不同行。

这是一个例子:

所以基本上costs 是这样计算的:

Sale * Production * Production % = Costs

我完全不确定的是:如何为 JTable 模型中的每一行赋予一种新的“类型”列。目前我正在使用这样的 JTable 模型:

public Object getValueAt(int row, int col) {
        Customer cd = customerList.get(row);
        switch (col) {
        case 0:
            return cd.getName();
        case 1:
            return cd.getAge(); 
        case 2:
            return cd.getPhone(); 
        default:
            break;
        }

        return null;
    }

对于如何实现这个用例有什么建议吗?

感谢您的回答!

【问题讨论】:

  • “列类型”是什么意思?不同的数据类型?不同的语义?
  • 问题不清楚:“如何为 JTable 模型中的每一行赋予新的“类型”列”。给一行一个列类型是什么意思?
  • TableCellRenderer/Editor 有 int columnIndex 和 int rowIndex 的参数,使用这两个坐标
  • Sale * Production * Production % = Costs 可以通过覆盖 setValueAt 来完成(最好的方法),为什么你从 MsExcel 中发布了截图
  • 为了获得更好的帮助,请尽快发布 SSCCE/MCVE 简短、可运行、可与局部变量中的硬编码值兼容,

标签: java swing jtable tablecellrenderer tablecelleditor


【解决方案1】:

如果您希望一行中的单元格具有特殊的格式或数据类型,只需执行您为Customer 所做的操作并切换列和行,即我假设您的表中的一个条目由单个列表示。

因此只需执行以下操作:

Report report = reports.get(col - 1); //made those names up but you should get the idea
switch (row) {
  ...
  case 5:
    double p = report.getPercentage(); //assuming 10% is stored as 0.1
    return String.format("%.0f%%", p * 100); //%.0f means a floating point number with 0 fraction digits
  ...
}

或者(尤其是如果您的模型需要更灵活,或者您只有一堆值,例如作为二维数组)将类型(即如何显示值)存储在具有行、列或单元格(行和列)索引作为键。

更新:

正如 mKorbel 在评论中所说,您最好让渲染器进行格式化。但是,问题是您不能只为每行注册一个渲染器,因此您必须想出另一个解决方案。

其中两个现在突然出现在我的脑海中:

  1. 子类JTable,以便覆盖getCellRenderer(row, col),以便为需要它的行提供PercentageCellRenderer。您必须配置是哪一行,例如在表模型中。

  2. 提供一个标准单元格渲染器,它检查getTableCellRendererComponent() 中的行和列并相应地应用格式。

【讨论】:

  • return String.format("%.0f%%", p * 100); ???, getValueAt 用于TableCellRendererDouble.Class 覆盖getColumnClass 并通过覆盖将Double 格式化为pct form 并不容易XxxRenderer,我会把这个答案删除为 ***
  • 没有 SSCCE/MCVE 就意味着拍摄到黑暗中
  • @mKorbel 好吧,将列类设置为 Double.class 可能还不够,因为 f.e. costs 可能需要不同的格式。但是,您是对的,让渲染器进行格式化,但由于 OP 似乎对即使是简单的事情也感到困惑,我试图给出当时我能想到的最简单的答案。
  • @mKorbel 另一个问题是该列没有明确的类,即它可能包含整数和双精度数。至少这就是我对 OP 的理解。
  • 检查了使用默认渲染器的完整示例here
猜你喜欢
  • 2013-06-02
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多