swing,在可编辑的jTable上显示JList,以选择自动完成文本的条目

时间:2009-11-10 09:49:44

标签: java swing jtable jlist

我有一个带可编辑单元格的JTable。每个单元格都包含一个CarretListener,用于快速验证输入的文本。但是在一个特殊单元格中,您应该能够从列表中选择托管。输入文本时会生成列表。程序员在列表中搜索相同的输入文本,如谷歌建议。到目前为止一切都很好。但我不明白如何在正确的位置显示列表。我尝试过GlassPane,但这种方法效果不佳。我有问题得到单元格的Cordinates并显示JList。 设置行高,这样显示整个列表也不起作用,因为我不想改变整行。 也许在TableCellRenderer中有一个技巧或者......? 我不想要一个完整的源代码,但是我需要向正确的方向推进。

以下是该程序的图片,它应该如下所示:http://img198.imageshack.us/img198/3227/sosollsseinh.jpg 谢谢你的关注

马克

2 个答案:

答案 0 :(得分:1)

除非您将特定行为应用于列表,否则您可以通过添加组合框作为此表的编辑器来尝试其他方式。请查看DefaultCellEditor以获取示例。

如果您在调用时使用正确的值修改组合框的内容,我认为它将符合您的需要。为此,您需要创建自己的CellEditor,最有可能通过实现TableCellEditor,以便您可以根据它的调用时间(在方法getTableCellEditorComponent()中)更改它的值。 / p>


编辑:关于您在评论中讨论的 KeyListener 问题,您必须考虑在JTextField中更新实际文本之前发送Key事件。因此,对getText()的调用返回没有新字符的值是正常的。

但是,由于这是KeyEvent,您可以直接使用evt.getKeyChar()evt.getKeyCode()来访问键入的字符,以检查这是否实际上是键入的字母。使用这些方法,您可以了解所需的完整“文本”。


此外,根据评论中的视频,您似乎想要一个实际上根据用户开始输入内容进行调整的列表,并根据已输入的内容限制选择。

如果您能够(并允许)使用额外的库,我建议您查看 SwingX组件http://swinglabs.org/)。该库通常提出了许多有用的组件,可用于swing接口。他们的网站上有一个演示,虽然它似乎在这个时间不可用,也许是晚些时候。

在他们的软件包“ autocomplete ”中,您将能够找到名为“AutoCompleteDecorator”的类以及其他有用的类,这将允许您改进Combobox编辑器,以便它可以尝试完成用户输入本身,并滚动到列表中的好位置(我认为它也可以过滤列表,你想要的确切行为,但我不完全确定)。如果你可以使用它,它实际上可以省去你自己处理插入事件的麻烦,以及更新列表,因为它很可能会为你做。

您可以在其网站上download the .Jar and the javadoc。来自其他网站的Here is a copy of the javadoc,对于自动完成包,虽然它可能在此期间发生了变化,但它会给你一个想法。

答案 1 :(得分:0)

你不能只是JCombobox而不是JList吗?那会更容易没有。由于DefaultCellEditor支持JCombobox开箱即用,

TableColumn X = table.getColumnModel().getColumn(Y);
JComboBox cb = new JComboBox(VECTOR_OF_ITEMS);
X.setCellEditor(new DefaultCellEditor(cb));