簡體   English   中英

如何禁用JTree的默認鍵行為?

[英]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());
    ...
    }
}

為了以外觀獨立的方式覆蓋JTreeBasicTreeUI.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM