Java 如何在JTree上禁用默认键行为?

Java 如何在JTree上禁用默认键行为?,java,swing,jtree,look-and-feel,keylistener,Java,Swing,Jtree,Look And Feel,Keylistener,我正在尝试创建一个JTree,它在键入字符(如字母、数字、字母)时具有特定的行为,以应用过滤器、装饰器等 一切似乎都很正常,但当我键入字母时,选择似乎会自动改变,并且与过滤器的行为方式不同。看起来这个行为是在BasicTreeUI.Handler.keyTypedKeyEvent e中定义的,我不知道如何以独立的方式避免或覆盖这个行为 有什么建议吗?JTree上有对按键做出反应的建议。下面的代码片段打印出其中一个输入映射中的可用绑定 import javax.swing.InputMap; im

我正在尝试创建一个JTree,它在键入字符(如字母、数字、字母)时具有特定的行为,以应用过滤器、装饰器等

一切似乎都很正常,但当我键入字母时,选择似乎会自动改变,并且与过滤器的行为方式不同。看起来这个行为是在BasicTreeUI.Handler.keyTypedKeyEvent 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不应再对这些按键做出反应。下面的代码片段打印出其中一个输入映射中的可用绑定

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());
    ...
    }
}
这对我很有用:

public class MyJTree extends JTree {

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

        return null;
    }
...
    public MyJTree (){
    ...
    setUI(new MyBasicTreeUi());
    ...
    }
}
为了以独立于外观的方式重写JTree的BasicTreeUI.Handler.keyTypedKeyEvent e行为,请尝试以下代码

JTree tree = new JTree();
for(KeyListener kl: tree.getListeners(KeyListener.class)) {
    tree.removeKeyListener(kl);
}
显然,UI的工作方式是在构建期间将KeyListener安装到JTree中,因此在构建JTree之后和添加自己的特定行为之前,只需删除已安装的KeyListener。

要以外观独立的方式重写JTree的BasicTreeUI.Handler.keyTypedKeyEvent e行为,请尝试以下代码

JTree tree = new JTree();
for(KeyListener kl: tree.getListeners(KeyListener.class)) {
    tree.removeKeyListener(kl);
}

显然,UI是通过在构建过程中将KeyListener安装到JTree中来完成工作的,因此在构建JTree之后,在添加自己的特定行为之前,只需删除已经安装的KeyListener即可。

注意:我已尝试使用key事件,这没有帮助。那么,除了遍历节点外,您的密钥还在执行您的操作?或者它们只是在发生冲突时遍历节点?注意:我尝试使用密钥事件,但没有帮助。因此,您的密钥除了遍历节点外,还执行您的操作?或者它们只是在发生冲突时遍历节点?谢谢,实际上这种行为是在BasicTreeUI.Handler中定义的,它是一个KeyListener。如果是在键绑定中,重新定义它会更简单…谢谢,实际上这个行为是在BasicTreeUI.Handler中定义的,它是一个键侦听器。如果是在键绑定中,重新定义它会更简单。。。