首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFrame/JDesktop未接收关键焦点

JFrame/JDesktop未接收关键焦点
EN

Stack Overflow用户
提问于 2011-02-26 05:14:12
回答 3查看 1.3K关注 0票数 1

我希望我的顶级JFrame以及JDesktopPane能够始终侦听关键事件,而不管当前关注/可见的组件是什么。

目前,当此程序启动时,JFrame正在接收关键事件OK。但是,如果单击JinternalFrame,则事件不再到达JFrame。即使我在JInternalFrame (应该是JDesktop组件)之外单击,事件也不会像开始时那样到达JFrame。为什么?谢谢。

代码语言:javascript
复制
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class focus extends JFrame implements KeyListener {

    private focus() {
        JDesktopPane desktop = new JDesktopPane();
        setContentPane(desktop);

        addPane(this, "one");
        addPane(this, "two");
        addPane(this, "three");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setSize(400, 450);

        addKeyListener(this);
    }

    public static void main(String[] args) {
        focus t = new focus();
    }

    private void addPane(JFrame frame, String name) {
        JTextArea textArea = new JTextArea();
        textArea.setName(name);
        textArea.setEditable(false);

        addWindow(frame, textArea, name);
    }

    private JInternalFrame addWindow(JFrame frame, JComponent component,
            String name) {
        JScrollPane scrollablePane = new JScrollPane(component);

        JInternalFrame iframe = new JInternalFrame(name + " ", true, true,
                true, true);

        iframe.setSize(300, 300);
        iframe.setLocation((int) (100 * Math.random()),
                (int) (100 * Math.random()));
        iframe.setVisible(true);
        iframe.getContentPane().add(scrollablePane);
        frame.getContentPane().add(iframe);

        return iframe;
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub      
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.err.println(e.getKeyChar());
        // TODO Auto-generated method stub
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }
}
EN

回答 3

Stack Overflow用户

发布于 2011-02-26 05:46:08

事件被调度到具有焦点的组件。

当焦点位于内部框架上时,为什么要让框架接收事件?你的实际需求是什么?

如果你想调用一个Action,那么最简单的方法就是使用带有菜单项的菜单栏,然后你可以给每个菜单项分配快捷键,这样就可以调用Action,而不管组件有没有焦点。

票数 1
EN

Stack Overflow用户

发布于 2011-02-26 05:36:31

因为您希望您的JFrame能够侦听所有的关键事件,而不管焦点在哪个元素上,因此将其作为关键侦听器添加到所有可以关注的元素。就像这样,

代码语言:javascript
复制
textArea.setEditable(false);
**textArea.addKeyListener(this);**

代码语言:javascript
复制
iframe.getContentPane().add(scrollablePane);
**iframe.addKeyListener(this);**
frame.getContentPane().add(iframe);
票数 0
EN

Stack Overflow用户

发布于 2011-02-26 06:13:03

您可能会对java.awt.KeyboardFocusManager类感兴趣。我相信它是一个类,除了其他事情之外,它将KeyEvents分派给聚焦组件。addKeyEventDispatcher和addKeyEventPostProcessor方法似乎可以分别用于在发送到聚焦组件之前和之后获取KeyEvents。

我以前从未使用过这个类,所以我不知道它是否能完成我期望的功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5122723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档