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

JTable单元格编辑是否可以使用按键?

井浩思
2023-03-14

在我的程序中,有一个带有许多加速器的JMenu和一个可编辑的JTable。问题是,当编辑JTable时,加速器键仍然会被触发。

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import java.awt.event.KeyEvent;
import java.awt.Toolkit;

public class SampleClass{

    public SampleClass(){

       JFrame frame = new JFrame();
       JMenuBar menuBar = new JMenuBar();
       JMenu menu = new JMenu();
       JMenuItem item = new JMenuItem();
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0));
       item.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                Toolkit.getDefaultToolkit().beep();
            }
        });
        JTable table = new JTable(new Object[][]{{"Hello","World"},{"Goodbye","World"}}, new String[]{"A","B"});    
           menu.add(item);
           menuBar.add(menu);
           frame.setJMenuBar(menuBar);           
           frame.add(table);
           frame.pack();
           frame.show();
        }

        public static void main(String[] args){
             new SampleClass();
        } 
}

编辑上表中的任何单元格,有一个菜单项设置为哔哔声与加速器'n'。

共有1个答案

慕容嘉荣
2023-03-14

这是一个bug(我以为很久以前就已经修复了…tsssee)是由于JTABLE的一个相当奇怪的键处理造成的。它开始在processKeyBinding中对按下的keyEvent进行编辑-如果autoStartEdits为true,就像默认情况一样-然后将该键传递给EditingComponent。因此,在一天结束时,如果editingComponent使用密钥,则使用密钥。TextComponents使用键入的键,而不是按下的键...这允许按下的键沿着分派链向上移动,直到到达菜单。

黑客攻击(小心:所有黑客攻击都是肮脏的,可能会有不可预见/不可原谅的副作用!)重写表的processKeyBinding并在启动编辑时使用该键:

@Override
protected boolean processKeyBinding(KeyStroke ks,
        KeyEvent e, int condition, boolean pressed) {
    boolean result = super.processKeyBinding(ks, e, condition, pressed);
    if (isEditing() && pressed) return true;
    return result;
}
 类似资料:
  • 问题内容: 有什么办法可以在jtable中动态制作不可编辑的单元格吗?每当用户提供类似false的输入时,我都想创建不可编辑的单元格…我已经在DefaultTableModel isCellEditable方法中看到过,但是如果我想使用它,则每次创建新对象时都会创建它,因此我想动态更改它为不可编辑。有人可以帮我吗?。谢谢 问题答案: 其他班级 然后,您可以通过使用存储的myModel变量并在其上调

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

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

  • 问题内容: 我想在JTable中将不可编辑的单元格显示为灰色。我正在使用这样的TableCellRenderer: 这有效,但有一个令人讨厌的伪像:最初,“复选框”是“左排列的”,当我按鼠标左键时,它移到“居中”,而当我释放鼠标按钮时,它又移回“左排列”。 如何避免这种令人讨厌的伪像,并且可能对我的问题有更好的简单解决方案? 问题答案: 返回的实例中。 附录:从美学角度,你可能想调理渲染的和基于编

  • 问题内容: 我正在尝试用我的程序解决一个奇怪的问题。该程序创建了一系列GUI和JTable,使用户能够生成XML文件。这些表之一是用于创建“语句”的。除了要说的是数据存储在多个2D数组中,这些2D数组又存储在哈希映射中之外,我将不做详细介绍。 这是发生了什么。当用户进入Statement屏幕时,将使用2D数组中的内容生成JTable。此数据填充用户能够修改的单元格。这些单元格之一(也是最重要的)是

  • 设计定制JTable我已经知道DefaultCellEditor在其构造函数中允许使用JComboBox。单击此JComboBox以显示列表项时,它显示在JTable的其他单元格上方。问题是,我需要一个更复杂的行为,就像JComboBox提供的那样,这样我就用一个JList和一个JButton实现了一个JTextField,当点击JButton(或者用户在JTextField中输入文本)时,JLi