1

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

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

有什么建议么?

4

3 回答 3

2

存在对这些按键做出反应的键绑定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不应再对这些按键做出反应

于 2012-08-07T05:48:37.907 回答
2

这对我有用:

public class MyJTree extends JTree {

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

        return null;
    }
...
    public MyJTree (){
    ...
    setUI(new MyBasicTreeUi());
    ...
    }
}
于 2017-01-16T21:10:50.850 回答
1

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

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

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

于 2019-08-27T16:21:15.580 回答