4

我是 Swing 的新手,今天一直在努力使用 JTable 组件。因为我正在尝试制作一张有点花哨的桌子,所以我还无法在任何地方找到我正在寻找的特定答案。

我想在表格的最顶部有一个“组”标题。这意味着跨越整个表的 3 或 4 行,并对各个列进行“分组”,实质上是对它们进行分区。

示例(请原谅眼睛疲劳):

////////////////////////////////ANIMALS//////////////////////////
/////////Mammals///////////////////////Rodents///////////////////
////People/////Dogs//////////Rats/////Rodents of Unusual Size////

其中斜杠(“/”)表示空格。第一个标题为“ANIMALS”,指的是表中的所有列。第二个标头向下划分 ANIMALS,依此类推。在第三个也是最后一个标题之后,我们到达了实际的表格,其中每一行将有 4 列,每种类型的 Animal 列。

显然这是一个例子,而且可能是一个糟糕的例子,但这就是我所说的“分区标题”的意思。

我的问题: 我看不到 JTableHeader 和 TableColumnModel 是如何支持这个功能的。如果他们这样做,有人可以将我推向正确的方向。如果他们不这样做,这肯定不会是 Swing 应用程序第一次需要这样的东西。任何人都知道的任何第 3 方组件?

另外,我希望能够在我的桌子上散布“Spacer”或 Spanning Rows,代表一组行。这些 Spacers 将存在于表内(不像标题那样位于表顶部),但会跨越每一列并具有单个标签,表示由后续行表示的组的名称。同样,我没有看到 Swing 支持这一点,有什么想法吗?

谢谢,我为真正糟糕的示例/绘图道歉。

4

4 回答 4

2

您也许可以调整这个古老的多行标题示例。

于 2011-08-17T00:14:36.650 回答
1

默认情况下,JTable 中只有一行标题(它不是 JTable 的正确行,它是 JTableHeader)。无论如何,您可以实现一个TableCellRenderer,它以一种看起来像是标题的方式显示前 n 个非标题行。

这些步骤或多或少如下:

  1. 实现 TableCellRenderer 以显示所需行的普通 JTable 的单元格,如标题的单元格

喜欢:

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

    this.setOpaque(true);
    TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
    return renderer.getTableCellRendererComponent(table, value, isSelected,
          hasFocus, row, column);
}
  1. 扩展 JTable 并实现以下方法以返回所需的单元格渲染器:

    public TableCellRenderer getCellRenderer(int row, int column){}
    

无论如何,根据您的要求,还有另一个问题需要解决:JTable 具有固定数量的列,因此您必须找到一种解决方法来获得该结果。

于 2011-08-16T20:21:37.800 回答
1

核心 Swing 不支持单元格(行/列)分组或拆分,无论是标题还是表格本身。设计的 JTable不是通用网格。试图将一些类似网格的行为和视觉效果调整到其中会与它的设计作斗争。是可以做到的,但实现起来并非易事。@Trashgod 指出了其中一些战斗(它们仍然有效吗?它们看起来像旧的第一代 Tame 示例?)。JIDE是支持它的商业产品(免责声明:从未在生产中使用它 :-)

于 2011-08-17T10:43:33.343 回答
0

您可能会发现这GroupableTableHeader很有用。

于 2012-04-16T05:40:02.543 回答