【问题标题】:Can JTable cell edit consume key strokes?JTable 单元格编辑可以消耗击键吗?
【发布时间】:2014-05-27 23:32:51
【问题描述】:

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

例如,如果我在 jtable 单元格中输入字母“n”,“下一个”菜单选项也会触发。

如何让 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”发出哔哔声。

【问题讨论】:

    标签: java swing jtable keystroke jmenu


    【解决方案1】:

    这是一个错误(我认为它在很久以前就已经修复了...... tsssee),因为 JTable 的密钥处理相当奇怪。它在按下的 keyEvent 上开始在 processKeyBinding 中进行编辑 - 如果 autoStartEdits 为真,默认情况下是这样 - 然后将该键传递给 editorComponent。所以在一天结束的时候,如果editingComponent 消费了这个key,它就会被消费掉。 TextComponents 在键入时使用一个键,而不是按下 ... 这允许按下的键沿着调度链向上移动,直到它到达菜单。

    一个 hackaround(注意:所有的 hack 都是肮脏的,并且可能有不可预见/不可预见的副作用!)是覆盖表的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2016-11-18
      • 2010-11-19
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      相关资源
      最近更新 更多