如何禁用JTree上的默认密钥行为?

时间:2012-08-06 18:20:38

标签: java swing jtree look-and-feel keylistener

我正在尝试在输入字母,数字,ponctuation等字符时设置具有特定行为的JTree,以应用过滤器,装饰器等。

一切似乎都运行良好,但是当我输入字母并且行为与我的过滤器的行为不同时,选择似乎会自动改变。看起来这种行为是在BasicTreeUI.Handler.keyTyped(KeyEvent e)中定义的,我不知道如何避免或轻易地覆盖这种行为,并且以独立于外观的方式。

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分: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,则{{1}}不应再对这些按键做出反应

答案 1 :(得分:2)

这对我有用:

public class MyJTree extends JTree {

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

        return null;
    }
...
    public MyJTree (){
    ...
    setUI(new MyBasicTreeUi());
    ...
    }
}

答案 2 :(得分:1)

为了以外观独立的方式覆盖BasicTreeUI.Handler.keyTyped(KeyEvent e)的{​​{1}}行为,请尝试以下代码。

JTree

很明显,UI通过在构造过程中将KeyListeners安装到JTree中来完成其工作,因此,在构造JTree之后以及添加自己的特定行为之前,只需删除已经安装的KeyListeners即可。