如何防止 JTable 单元格开始编辑某些击键?
How to prevent JTable cell from starting editing on certain key strokes?
我正在我的 JTable 中实现 Undo/Redo 功能,但我对 JTable 的默认行为有疑问,它会在按下任何按键时开始编辑单元格。
问题是它也在 CTRL+Z 和 CTRL+ 上开始编辑Y.
如何在按下这两个键时防止单元格编辑?
注意:我有多个面板,一个面板内有多个表格,我尝试覆盖 isCellEditable()
但失败了。
此示例阻止在 CTRL+Z 和 CTRL+[ 上编辑单元格=17=]Y。它通过以下方式实现:
- 覆盖
CellEditor.isCellEditable
- 检查传递的事件对象是否是
KeyEvent
的实例
- 如果是,按下的键是CTRL+Z或CTRL+Y,它returns假
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 );
}
});
}
}
我正在我的 JTable 中实现 Undo/Redo 功能,但我对 JTable 的默认行为有疑问,它会在按下任何按键时开始编辑单元格。
问题是它也在 CTRL+Z 和 CTRL+ 上开始编辑Y.
如何在按下这两个键时防止单元格编辑?
注意:我有多个面板,一个面板内有多个表格,我尝试覆盖 isCellEditable()
但失败了。
此示例阻止在 CTRL+Z 和 CTRL+[ 上编辑单元格=17=]Y。它通过以下方式实现:
- 覆盖
CellEditor.isCellEditable
- 检查传递的事件对象是否是
KeyEvent
的实例
- 如果是,按下的键是CTRL+Z或CTRL+Y,它returns假
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 );
}
});
}
}