我有一个自定义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给任何可以提供一些见解/帮助的人!
答案 0 :(得分:2)
1)为什么要在TableModel中存储组件?那效率不高。您应该将数据存储在TableModel中。 JTable旨在使用单个组件呈现数据。默认渲染器通常是JLabel。然后,当您编辑单元格时,将使用不同的组件。
单击单元格时,可能需要重新渲染上一行(以删除行选择),然后使用选择渲染当前行。因此,为每个受影响的可见单元调用渲染器。对应用程序进行制表可能会导致所有可见单元格重新渲染。
2)很难回答,因为这不是默认行为。您还必须使用自定义编辑器,我不知道您的自定义代码是什么样的。默认编辑器有一个setClickCountToStart()方法,默认为2.也许你将它设置为1.
更改您的解决方案以使用TableModel中的数据(而不是组件),如果您还有其他问题,请发布SSCCE。