首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java行为- JTable和TableCellRenderer

Java行为- JTable和TableCellRenderer
EN

Stack Overflow用户
提问于 2011-09-03 05:02:11
回答 1查看 789关注 0票数 1

我有一个为所有JComponents创建的自定义JTable (15行乘20个cols)。我目前正在将它用于JComboBoxes、JTextFields和JButtons的混合体。哦,我使用的是Java5 (这是必须的)。

我有两个问题:

1)第一个关于TableCellRenderer类,以及它的单个方法:

代码语言:javascript
复制
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次。当在两个不相关的应用程序之间使用AltTab键时(我使用的是Win7),这个方法被调用了200多次(并且只针对JButtons和JTextFields)!这有必要吗?如果没有,我如何停止不必要的渲染调用?

2)第二个问题与JTable本身有关。当我编辑一个单元格时(光标在JTextField上闪烁),当我点击另一个单元格时,那个单元格只被选中。但是,如果我随后单击另一个单元格,我将开始编辑该单元格。我所能想到的就是从最初的编辑组件中选择JTable,然后在其中选择组件。有什么方法可以改变这一点吗?选择一个方向(总是在第一次单击时选择jtable )或另一个方向(总是在第一次单击时进入单元格)。如果可能的话,我更喜欢第一种选择。

感谢任何能给予一些见解/帮助的人!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-03 06:44:19

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

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

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

将您的解决方案更改为在TableModel中使用数据(而不是组件),如果有进一步的问题,请发布您的SSCCE

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7289184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档