在获得焦点的JTable中的单元格中开始编辑

我已按以下方式为表中的两列定义了单元格编辑器:

Java代码:

JComboBox combo = new JComboBox(); //code to add items to the combo box goes here. JTextField textField = new JTextField(); textField.setHorizontalAlignment(JTextField.RIGHT); TableColumn column = myJTable.getColumnModel().getColumn(0); column.setCellEditor(new DefaultCellEditor(combo)); column = myJTable.getColumnModel().getColumn(1); column.setCellEditor(new DefaultCellEditor(textField)); 

我面临的问题是,当焦点移动到表格单元格时,单元格不会自动编辑。 因此,当焦点移动到第2列(具有文本字段作为编辑器)时,除非双击单元格或用户开始键入,否则不会显示插入符号。 第1列(具有combobox作为编辑器)的情况类似,因为除非单击单元格,否则不会出现combobox。 这些行为是违反直觉的,对于使用键盘操作的用户来说是不受欢迎的。:(

请建议如何解决这个问题。

提前致谢。

如上所述,您可以将JComboBox用作渲染器和编辑器。 下面是一个非常基本的例子。 它还显示DefaultCellEditor.setClickCountToStart()用法。

 import java.awt.Component; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class ComboBoxEditorDemo { public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { JFrame frame = new JFrame("ComboBoxEditorDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTable table = new JTable( new Object[][] { { "1", "2" }, { "1", "2" } }, new Object[] {"Col1", "Col2" }); table.setRowHeight(24); TableColumn column = table.getColumnModel().getColumn(1); column.setCellRenderer(new MyComboBoxRenderer(new String[] { "1", "2", "3" })); column.setCellEditor(new MyComboBoxEditor(new String[] { "1", "2", "3" })); DefaultCellEditor editor = new DefaultCellEditor(new JTextField()); editor.setClickCountToStart(1); column = table.getColumnModel().getColumn(0); column.setCellEditor(editor); JScrollPane scrollPane = new JScrollPane(table); frame.add(scrollPane); frame.pack(); frame.setVisible(true); } static class MyComboBoxRenderer extends JComboBox implements TableCellRenderer { public MyComboBoxRenderer(String[] items) { super(items); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); super.setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); } setSelectedItem(value); return this; } } static class MyComboBoxEditor extends DefaultCellEditor { public MyComboBoxEditor(String[] items) { super(new JComboBox(items)); } } } 
  1. 此示例使用JTextField覆盖具有DefaultCellEditorJTable中的editCellAt()

  2. 您可以将Space键绑定到为JTable定义的startEditing操作:

     table.getInputMap().put( KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "startEditing");