[英]How to disable the default key behaviour over a JTree?
我試圖制作一個JTree,當鍵入諸如字母,數字,字母,應用過濾器,修飾符等字符時,它具有特定的行為。
一切似乎都工作正常,但是當我鍵入字母時,選擇似乎會自動更改,並且其行為與我的過濾器不同。 看起來,此行為是在BasicTreeUI.Handler.keyTyped(KeyEvent e)
定義的,我不知道如何以與外觀無關的方式輕松地避免或覆蓋此行為。
有什么建議么?
JTree
上存在按鍵綁定 ,可對這些按鍵進行反應。 以下代碼片段在其中一個輸入映射中打印出可用的綁定
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
不應再對這些按鍵做出反應
這為我工作:
public class MyJTree extends JTree {
public class MyBasicTreeUi extends BasicTreeUI{
@Override
protected KeyListener createKeyListener() {
return null;
}
...
public MyJTree (){
...
setUI(new MyBasicTreeUi());
...
}
}
為了以外觀獨立的方式覆蓋JTree
的BasicTreeUI.Handler.keyTyped(KeyEvent e)
行為,請嘗試以下代碼。
JTree tree = new JTree();
for(KeyListener kl: tree.getListeners(KeyListener.class)) {
tree.removeKeyListener(kl);
}
顯然,UI通過在構造期間將KeyListeners安裝到JTree中來完成其工作,因此,在構造JTree之后以及添加自己的特定行為之前,只需刪除已經安裝的KeyListeners。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.