2012-08-06 23 views
1

我試圖做一個JTree時,輸入字符,如字母,數字,標點符號,應用過濾器,裝飾等具有特定的行爲如何禁用JTree上的默認鍵行爲?

一切似乎工作正常,但選擇似乎是當我輸入字母時會自動改變,而且行爲與我的過濾器不一樣。看起來這種行爲在BasicTreeUI.Handler.keyTyped(KeyEvent e)中定義,我不知道如何避免或輕易忽略這種行爲,並且以獨立於外觀的方式。

有什麼建議嗎?謝謝!

+0

注意:我試圖消費的關鍵事件,它沒有幫助。 – 2012-08-06 18:42:56

+0

因此,除了遍歷節點之外,您的密鑰還在執行您的操作嗎?或者他們只是在發生衝突時遍歷節點? – Angie 2012-08-06 20:43:58

回答

2

JTree上有Key Bindings,它們對這些按鍵有反應。下面的代碼片段打印出可用綁定在輸入的一個映射

import javax.swing.InputMap; 
import javax.swing.JComponent; 
import javax.swing.JTree; 
import javax.swing.KeyStroke; 
import java.awt.EventQueue; 

public class TreeActionMap { 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     JTree tree = new JTree(); 
     InputMap inputMap = tree.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     KeyStroke[] keyStrokes = inputMap.allKeys(); 
     for (KeyStroke keyStroke : keyStrokes) { 
      Object actionCommand = inputMap.get(keyStroke); 
      System.out.println("keyStroke = " + keyStroke); 
      System.out.println("actionCommand = " + actionCommand); 
     } 
     } 
    }); 

    } 
} 

所以,如果你遍歷所有InputMap情況,並呼籲所有的人clear,在JTree不應該再在這些按鍵反應

+0

最深的知識永遠不會...... – mKorbel 2012-08-07 07:07:13

+0

謝謝,實際上這個行爲是在BasicTreeUI.Handler中定義的,它是一個KeyListener。重新定義它是否在關鍵綁定中會更簡單... – 2012-08-07 14:50:17

1

這工作對我來說:

public class MyJTree extends JTree { 

    public class MyBasicTreeUi extends BasicTreeUI{ 
     @Override 
     protected KeyListener createKeyListener() { 

     return null; 
    } 
... 
    public MyJTree(){ 
    ... 
    setUI(new MyBasicTreeUi()); 
    ... 
    } 
} 
相關問題