【问题标题】:JFrame/JDesktop not receving key focusJFrame/Desktop 没有接收到关键焦点
【发布时间】:2011-02-25 21:14:11
【问题描述】:

我希望我的顶级 JFrame 以及 JDesktopPane 始终监听关键事件,无论当前关注/可见哪个组件。

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

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
    }
}

【问题讨论】:

    标签: java swing keylistener


    【解决方案1】:

    事件被分派给具有焦点的组件。

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

    如果你想调用一个Action,那么最简单的方法是使用带有菜单项的菜单栏,然后​​你可以为每个菜单项分配快捷键,这样无论组件有焦点都可以调用Action。

    【讨论】:

      【解决方案2】:

      由于您希望 JFrame 能够侦听所有关键事件,无论焦点位于哪个元素上,请将其作为关键侦听器添加到所有可以关注的元素。像这样,

      textArea.setEditable(false);
      **textArea.addKeyListener(this);**
      

      iframe.getContentPane().add(scrollablePane);
      **iframe.addKeyListener(this);**
      frame.getContentPane().add(iframe);
      

      【讨论】:

        【解决方案3】:

        您可能对java.awt.KeyboardFocusManager 课程感兴趣。我相信是这个类,除其他外,将 KeyEvents 分派到焦点组件。看来 addKeyEventDispatcher 和 addKeyEventPostProcessor 方法可以分别用于在发送到焦点组件之前和之后获取 KeyEvents。

        我以前从未使用过这个类,所以我不知道它是否符合我的预期。

        【讨论】:

          猜你喜欢
          • 2011-01-20
          • 2013-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-21
          相关资源
          最近更新 更多