1

我有一个自定义 JTable(15 行 x 20 列),它被创建为适用于所有 JComponents。我目前将它用于 JComboBoxes、JTextFields 和 JButtons 的混合。哦,我正在使用 Java5(一个要求)。

我有两个问题:

1)首先是关于 TableCellRenderer 类,以及它的单一方法:

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

它所做的只是将Object value参数转换为 JComponent,并可能更改背景颜色。没什么大不了。我的问题是为什么这种方法经常被称为。选择单个单元格时,会调用 23 次。在两个 UNRELATED 应用程序(我使用 Win7)之间使用 Alt-Tabbing 时,此方法被调用了 200 多次(并且仅适用于 JButtons 和 JTextFields)!这是否有必要,如果没有,我怎样才能停止不必要的渲染调用?

2)第二个问题是关于 JTable 本身。当我正在编辑一个单元格(JTextField 中的光标并闪烁)并单击另一个单元格时,仅选择了该单元格。但是,如果我随后单击另一个单元格,我将开始编辑该单元格。我能想到的是,从最初的编辑组件中,我选择了 JTable,然后选择了其中的组件。有什么办法可以改变这个吗?要么走一条路(总是在第一次点击时选择 jtable),要么走另一条路(总是在第一次点击时进入单元格)。如果可能的话,我更喜欢第一个选项。

感谢任何可以提供一些见解/帮助的人!

4

1 回答 1

2

1) 为什么要将组件存储在 TableModel 中?那是没有效率的。您应该将数据存储在 TableModel 中。JTable 旨在使用单个组件呈现数据。默认渲染器通常是 JLabel。然后,当您编辑单元格时,将使用不同的组件。

当您单击一个单元格时,您可能需要重新渲染前一行(以删除行选择),然后使用选择渲染当前行。因此,每个受影响的可见单元都会调用渲染器。切换到应用程序可能会导致重新渲染所有可见单元格。

2)很难回答,因为这不是默认行为。您还必须使用自定义编辑器,我不知道您的自定义代码是什么样的。默认编辑器有一个 setClickCountToStart() 方法,默认为 2。也许你将它设置为 1。

如果您有其他问题,请更改您的解决方案以在 TableModel 中使用数据(而不是组件)并发布您的SSCCE 。

于 2011-09-02T22:44:18.730 回答