Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获得焦点后,在JTable中的单元格中开始编辑_Java_Swing_Focus_Jtable_Tablecelleditor - Fatal编程技术网

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

Java 获得焦点后,在JTable中的单元格中开始编辑,java,swing,focus,jtable,tablecelleditor,Java,Swing,Focus,Jtable,Tablecelleditor,我已按以下方式为表中的两列定义了单元格编辑器: 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.getColumnM

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

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列的情况类似(它有一个组合框作为编辑器),因为在这里,除非单击单元格,否则组合框不会出现。这些行为违反直觉,对于使用键盘操作的用户来说是不可取的:(

请就如何解决这一问题提出建议

提前谢谢

  • 这将使用
    JTextField
    覆盖
    JTable
    中的
    editCellAt()
    ,该表具有
    DefaultCellEditor

  • 您可以将空格键绑定到为
    JTable
    定义的
    startEditing
    操作:

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

  • 如上所述,您可以使用JComboBox作为渲染器和编辑器


    您还可以使用
    JComboBox
    作为单元格呈现程序。您还可以利用来覆盖默认的双击行为。
    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));
            }
        }
    }