Java行为 - JTable和TableCellRenderer

时间:2011-09-02 21:02:11

标签: java jtable behavior tablecellrenderer

我有一个自定义JTable(15行乘20列),它是为所有JComponents工作而创建的。我目前正在将它用于JComboBoxes,JTextFields和JButton的混合体。哦,我正在使用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,并可能更改背景颜色。没什么大不了。我的问题是为什么这个方法经常被称为sooooo。选择单个单元格时,会调用23次。当两个UNRELATED应用程序之间的Alt-Tabbing(我使用Win7)时,此方法被调用超过200次(仅适用于JButtons和JTextFields)! 这是否有必要,如果没有,我该如何阻止不必要的渲染调用?

2)第二个问题涉及JTable本身。当我正在编辑一个单元格(光标在JTextField中并闪烁)并且我单击另一个单元格时,该单元格仅被选中。然而,如果我然后单击另一个单元格,我开始编辑该单元格。我能想到的是,从初始编辑组件开始,我选择JTable,然后选择其中的组件。有没有办法改变这个?从一种方式(始终在第一次单击时选择jtable)或另一种方式(始终在第一次单击时进入单元格)。如果可能的话,我更喜欢第一种选择。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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