2011-09-02 67 views
1

我有一个为所有JComponents工作而创建的自定义JTable(15行20列)。我目前正在使用它来混合JComboBoxes,JTextFields和JButtons。哦,我正在使用Java5(一项要求)。Java行为 - JTable和TableCellRenderer

我有两个问题:

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应用程序(我使用Win7)之间的Alt-Tabbing时,这个方法被调用超过200次(并且仅用于JButtons和JTextFields)! 这是否有必要,如果不是,我该如何阻止不必要的渲染调用?

2)第二个问题关于JTable本身。当我编辑单元格(JTextField中的光标并闪烁),然后单击另一个单元格时,该单元格仅被选中。如果我然后点击另一个单元格,但是,我开始编辑该单元格。我能想到的是,从最初的编辑组件中,我选择了JTable,然后选择其中的组件。有什么方法可以改变它吗?以一种方式(总是在第一次点击时选择jtable)或另一种(总是在第一次点击时进入单元格)。如果可能,我宁愿选择第一个选项。

Thansk给任何人谁可以授予一些见解/帮助!

回答

2

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

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

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

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

+0

只是一个问题,因为我永远不会碰到Java5,Java5和Java6之间的TableRenderer是否有重大变化,btw特别描述+1 – mKorbel

+0

由于这将是对API的更改,因此没有任何更改。 – camickr

+0

真的是我的白痴问题,感谢宝贵的信息 – mKorbel