Milos Misic
Milos Misic

Reputation: 61

How to prevent JTable cell from starting editing on certain key strokes?

I am implementing Undo/Redo feature into my JTable but I have a problem with default behavior of JTable which starts editing a cell on any key press.

The problem is that it also starts editing on CTRL+Z and CTRL+Y.

How to prevent cell editing when these two keys are pressed?

NOTE: I have multiple panels with multiple tables inside one panel and I have tried overriding isCellEditable() but failed.

Upvotes: 4

Views: 652

Answers (1)

TT.
TT.

Reputation: 16144

This example prevents a cell being edited on CTRL+Z and CTRL+Y. It does so by:

  1. Overriding CellEditor.isCellEditable
  2. Checking whether the event object passed is an instance of KeyEvent
  3. If so, and the key pressed is CTRL+Z or CTRL+Y, it returns false

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 );
            }
        });
    }
}

Upvotes: 5

Related Questions