如何防止JTable单元在某些击键开始编辑?

时间:2016-12-13 08:27:59

标签: java swing jtable

我在我的JTable中实现了撤销/重做功能,但我遇到了JTable默认行为的问题,它在任何按键开始时都会开始编辑单元格。

问题是它还开始编辑 CTRL + Z CTRL + Y

如何在按下这两个键时阻止单元格编辑?

注意:我有多个面板,在一个面板中有多个表格,我尝试覆盖isCellEditable()但失败了。

1 个答案:

答案 0 :(得分:3)

此示例阻止在 CTRL + Z CTRL + Y 上编辑单元格。它通过以下方式实现:

  1. 覆盖CellEditor.isCellEditable
  2. 检查传递的事件对象是否为KeyEvent
  3. 的实例
  4. 如果是,并且按下的键是 CTRL + Z CTRL + Y ,则返回false
  5. import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.KeyEvent;
    import java.util.EventObject;
    
    import javax.swing.DefaultCellEditor;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.table.TableCellEditor;
    
    public class JTableWithCtrlZ {
        private JTableWithCtrlZ( ) {}
    
        @SuppressWarnings("serial")
        private static JTable createTable( ) {
            return new JTable( 10, 10 ) {
                @Override
                public TableCellEditor getDefaultEditor( Class<?> columnClass ) {
                    return new DefaultCellEditor( new JTextField( ) ) {
                        @Override
                        public boolean isCellEditable( EventObject anEvent ) {
                            if( anEvent instanceof KeyEvent ) {
                                KeyEvent ke = (KeyEvent) anEvent;
                                if( ( ke.getKeyCode( ) == KeyEvent.VK_Z || ke.getKeyCode( ) == KeyEvent.VK_Y ) &&
                                    ( ke.getModifiersEx( ) & KeyEvent.CTRL_DOWN_MASK ) == KeyEvent.CTRL_DOWN_MASK )
                                    return false;
                            }
    
                            return super.isCellEditable( anEvent );
                        }
                    };
                }
            };
        }
    
        public static JFrame createFrame( ) {
            JPanel p = new JPanel( );
            p.setLayout( new BorderLayout( ) );
            p.add( new JScrollPane( createTable( ) ), BorderLayout.CENTER );
            p.setPreferredSize( new Dimension( 250, 150 ) );
    
            JFrame f = new JFrame( );
            f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            f.setContentPane( p );
            f.pack( );
            return f;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater( new Runnable() {
                @Override
                public void run() {
                    createFrame( ).setVisible( true );
                }
            });
        }
    }