当前位置: 首页 > 知识库问答 >
问题:

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

罗智志
2023-03-14

我在我的JTable中实现撤消/重做功能,但是我在JTable的默认行为上有一个问题,它会在任何键按下时开始编辑单元格。

当按下这两个键时,如何防止单元格编辑?

注意:我有多个面板,其中一个面板内有多个表,我尝试重写iscelleditable(),但失败了。

共有1个答案

通远
2023-03-14

此示例防止在Ctrl+ZCtrl+Y上编辑单元格。它通过以下方式做到这一点:

  1. 重写celleditor.iscelleditable
  2. 检查传递的事件对象是否是KeyEvent
  3. 的实例
  4. 如果是,并且按下的键是Ctrl+ZCtrl+Y,则返回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 );
            }
        });
    }
}
 类似资料:
  • 设计定制JTable我已经知道DefaultCellEditor在其构造函数中允许使用JComboBox。单击此JComboBox以显示列表项时,它显示在JTable的其他单元格上方。问题是,我需要一个更复杂的行为,就像JComboBox提供的那样,这样我就用一个JList和一个JButton实现了一个JTextField,当点击JButton(或者用户在JTextField中输入文本)时,JLi

  • 问题内容: 你们真是太棒了,为我在最后一个问题上指明了正确的方向,我在这里对我原来的问题进行了扩展: 如何将JTable列设置为String并排序为Double? 由于现在我使用自定义单元格渲染器将价格列的格式设置为$ ###,## 0.00,因此我现在还为该单元格设置了JTextField编辑器。单元格的编辑工作正常,除了更新值时,自定义渲染器中设置的数字格式似乎不再格式化单元格(在提交编辑后,

  • 问题内容: 我需要在jTable中显示数字,精确到小数点后两位。为此,我创建了一个自定义单元格编辑器,如下所示: 该单元格编辑器非常适合将点用作小数点的英语语言环境。但是在德语语言环境中,它不接受逗号作为小数点的值。请让我知道我的代码中有问题的地方。提前致谢。 编辑:这是我如何使其工作: 问题答案: 使用语言环境来发挥您的优势:

  • 我想要一个有4列的jtable。一列必须是组合框。其他列是字符串。 只要找到问题:在注释语句jcb.seteditable(true)时;,如果我在comboxcell上单击一次,它就会打开这个单元格。但我不知道为什么效果更好。此外,我希望combox可编辑。 我怎么能对其他细胞有同样的行为。 再次您好,我已经更新了代码,以便使-如果我通过重写方法在单元格上单击一次,单元格可以编辑-如果我通过重写

  • 问题内容: 我正在尝试实现本教程中描述的自定义TableRenderer 。我想让渲染器对每个给定单元格很长的文本进行换行。这个想法是,使用TextArea作为渲染器,因为它支持换行。但是,以下代码无法正常工作: 我将此渲染器设置为 但是单元格条目保持未包装状态。如果我添加到该方法,则所有单元格都按预期是黄色,但没有被包裹。 有任何想法吗? 更新: 正如Michael Borgwardt在评论中指

  • 我的代码有一个特殊的问题。 然后它会发生在图像上出现的事情。我需要汉字列是CENTER对齐,但出于某种原因,'tcr,不工作,因为它应该是,但默认渲染器正在做它应该是。 有什么建议/帮助吗?