有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

有什么建议吗


共 (3) 个答案

  1. # 1 楼答案

    这对我很有用:

    public class MyJTree extends JTree {
    
        public class MyBasicTreeUi extends BasicTreeUI{
            @Override
            protected KeyListener createKeyListener() {
    
            return null;
        }
    ...
        public MyJTree (){
        ...
        setUI(new MyBasicTreeUi());
        ...
        }
    }
    
  2. # 2 楼答案

    为了以独立于外观的方式重写BasicTreeUI.Handler.keyTyped(KeyEvent e)JTree行为,请尝试以下代码

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

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

  3. # 3 楼答案

    Key Bindings出现在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应该不再对这些按键做出反应