2014-04-14 81 views
0

在我的程序中,有一個包含許多加速器的JMenu和一個可編輯的JTable。問題是,在編輯JTable時,加速鍵仍然被觸發。例如,如果我在jtable單元格中輸入字母'n',則'下一個'菜單選項也會被觸發。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'發出嗶聲。

回答

2

由於JTable的一個相當奇怪的關鍵處理,這是一個錯誤(我認爲這個錯誤在很久以前已經被修復... tsssee)。它在一個按下的keyEvent的processKeyBinding中開始編輯 - 如果autoStartEdits爲true(默認情況下爲true),然後將該鍵傳遞給editingComponent。因此,在一天結束時,如果editComponent使用它,則會消耗密鑰。 TextComponents在輸入時消費一個鍵,而不是按下......這使得按下的按鍵可以在調度鏈上行進,直到它到達菜單。

一個hackaround(注意:所有的黑客都很髒,可能有意外/ unforseable副作用)是覆蓋表的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; 
} 
相關問題