JFrame / JDesktop не получает ключевой фокус - PullRequest
1 голос
/ 26 февраля 2011

Мне бы хотелось, чтобы мой JFrame высшего уровня, а также JDesktopPane всегда прослушивали ключевые события, независимо от того, какой компонент в данный момент сфокусирован / видим.

В настоящее время, когда эта программа запускается, JFrame получает ключевые события OK. Однако если щелкнуть JinternalFrame, события больше не достигают JFrame. Даже если я щелкаю за пределами JInternalFrame (который должен быть компонентом JDesktop), события больше не достигают JFrame, как это было в начале. Зачем? Thx.

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

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

События отправляются компоненту, который имеет фокус.

Почему вы хотите, чтобы кадр получал события, когда фокус находится на внутреннем кадре?Каково ваше действительное требование?

Если вы хотите вызвать действие, то самый простой способ - использовать строки меню с элементами меню, а затем вы можете назначить ускорители для каждого пункта меню, чтобы действие могло быть вызвано независимо отс компонентом имеет фокус.

0 голосов
/ 26 февраля 2011

Возможно, вас заинтересует класс java.awt.KeyboardFocusManager . Я полагаю, что это класс, который, помимо прочего, отправляет KeyEvents на целевой компонент. Похоже, что методы addKeyEventDispatcher и addKeyEventPostProcessor можно использовать для получения KeyEvents до и после отправки в целевой компонент, соответственно.

Я никогда не использовал этот класс раньше, поэтому я не знаю, выполняет ли он то, что я ожидаю.

0 голосов
/ 26 февраля 2011

Поскольку вы хотите, чтобы ваш JFrame мог прослушивать все ключевые события независимо от того, на каком элементе находится фокус, добавьте его в качестве ключевого слушателя ко всем элементам, на которые можно обратить внимание. Вот так

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

и

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