【问题标题】:How to disable the default key behaviour over a JTree?如何禁用 JTree 上的默认键行为?
【发布时间】:2012-08-06 18:20:37
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 注意:我试过消费key事件,没用。
  • 那么除了遍历节点之外,您的密钥还在执行您的操作?或者他们只是在发生冲突时遍历节点?

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


【解决方案1】:

Key Bindings 存在于 JTree 上,它们会对这些按键做出反应。以下代码 sn -p 打印出其中一个输入映射中的可用绑定

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 实例并在所有实例上调用 clearJTree 不应再对这些按键做出反应

【讨论】:

  • 谢谢,实际上这种行为是在作为 KeyListener 的 BasicTreeUI.Handler 中定义的。如果它在键绑定中重新定义会更简单......
【解决方案2】:

这对我有用:

public class MyJTree extends JTree {

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多