每当按下alt键时,JComponent都会不必要地吸引焦点

时间:2019-06-01 00:58:44

标签: java swing focus

我正在尝试构建一个简单的文本编辑器。在左侧应该是用于输入的文本字段,在右侧我正在尝试设置pdf查看器。那些单独工作正常,但是当我将它们放在一起时,只要我按“ alt”键,pdf查看器就总是抓住焦点,这使我无法在文本字段中输入某些字符。

我使用的PDF查看器基于“ Swing-Native”项目(http://djproject.sourceforge.net/ns/)。它通过模拟JComponent内部要运行的程序的窗口来工作。这可以正常工作,但是每当我按下alt键时,pdf-viewer就会将焦点集中在菜单快捷方式上。它独立于当前关注的组件执行此操作。

我尝试了很多修复它的方法,包括将查看器的setFocusable方法设置为false,并结合使用焦点和键侦听器以及文本区域的requestFocus / requestWindowFocus方法,以便在“ alt”键。我尝试过的任何事情都没有导致行为改变。

PDF-Viewer实现了一个来自“ Swing-Native”项目的名为JWebBrower的类,该类本身就是JPanel。在初始化期间,将设置以下值:

setStatusBarVisible(false);
setBarsVisible(false);
setActionMap(null);
setAutoscrolls(false);
setFocusable(false);

这通常会使JPanel不能聚焦,除非它不能聚焦。在注册到TextArea的简单KeyListener中,我尝试通过将焦点从显示对象(pdf-viewer)重置为文本区域来解决此问题。

        text.requestFocusInWindow();
        display.setRequestFocusEnabled(false);
        display.setFocusable(false);

这也确实证明了自己毫无用处。有趣的是,KeyListener获取了触发器,但是JTextArea没有注册击键。我曾考虑过将DocumentEvent调度到文本区域,但是我真的不知道如何正确执行它,并且肯定有比这更好的方法来解决问题。

足够有趣的是,每当按下“ alt”键时,插入符号也会更改,指示查看器组件已接管。一旦我单击TextArea,插入符号就会恢复为正常,但是只要不改变“ alt”键,插入符号就会持续存在。

任何想法都值得欢迎,到目前为止,我还是一无所知。

编辑:我对Oppon进行了进一步检查,发现用alt键掩盖的每个键的KeyBindings在TextArea上也不起作用。我也无法弄清楚这些键是如何绑定到该麻烦的组件的,因为它的输入和操作映射都是空的,并且似乎没有绑定任何侦听器。

EDIT2:我找到了一种解决方法:在对源代码进行一些挖掘之后,我发现导致问题的组件将覆盖Component.class的processKeyEvent方法。它将其发送到自定义ComponentPeer,后者使用事件并获取焦点。我的解决方案是使用反射将根部剥离出内部ComponentPeer。

// Capturing peer to get rid of annoying key events
Component nativeComp = getNativeComponent();
try {
    Field peer = Component.class.getDeclaredField("peer");
    peer.setAccessible(true);
    ComponentPeer peer1 = (ComponentPeer) peer.get(nativeComp);

    if (peer1 != null) {
        SlavePeer newPeer = new SlavePeer(peer1);
        peer.set(nativeComp, newPeer);
    }
} catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
}

这不是最优雅的解决方案,但它可以工作。 SlavePeer类扩展了ComponentPeer,并且仅将除某些KeyEvent之外的所有内容重定向到原始对等体。

0 个答案:

没有答案