Ввод с клавиатуры в Java-апплете

#java #keyboard #applet #jframe #keyboard-events

#java #клавиатура #апплет #jframe #клавиатура-события

Вопрос:

Каков наилучший способ прослушивания ввода с клавиатуры в Java-апплете?

У меня есть апплет, который открывает JFrame, и я использую KeyListener для прослушивания ввода с клавиатуры. Это отлично работает в моей среде разработки (eclipse), но когда я запускаю апплет через браузер (я пробовал Firefox и IE), он не реагирует на события клавиатуры. Однако, если я запускаю апплет, а затем сворачиваю и максимизирую фрейм, это работает. Я пробовал устанавливать фокус на JFrame многими различными способами, а также программно минимизировать и максимизировать его, но безрезультатно. Я также пробовал привязки клавиш, но с той же проблемой.

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

 public class AppletTest extends Applet 
{    
    private GuiTest guiTest; 

    public void init() {
        guiTest = new GuiTest();
        final AppletTest at = this;
        guiTest.addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent ke) {
                at.keyPressed(ke);
            }
            public void keyReleased(KeyEvent ke) {}
            public void keyTyped(KeyEvent e) {}             
        });
    }

    private void keyPressed(KeyEvent ke)
    {
        System.out.println("keyPressed " KeyEvent.getKeyText(ke.getKeyCode()));
        getGuiTest().test(KeyEvent.getKeyText(ke.getKeyCode()));
    }
}

public class GuiTest extends JFrame {
    String teststring = "?";
    public GuiTest()
    {
        setSize(100,100);
        setEnabled(true);
        setVisible(true);
        setFocusable(true);
        requestFocus();
        requestFocusInWindow();
        toFront();
    }

    public void test(String t)
    {
        teststring = t;
        repaint();
    }

    public void paint(Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.black);
        g.drawString(teststring, 50, 50);
    }
}
  

Комментарии:

1. Из любопытства, почему вы хотите напрямую фиксировать нажатия клавиш?

2. Я создаю игру, управляемую с клавиатуры. Это также причина, по которой я использую метод paint, а не Components. Я хотел бы также использовать его для сочетаний клавиш для меню.

Ответ №1:

Я решил проблему. Если я создаю JFrame после нажатия кнопки или события мыши в апплете, прослушиватель клавиш в JFrame работает. По-видимому, создание фрейма с помощью Applet.init() означает, что прослушиватели ключей не работают корректно при открытии через браузер.

Однако остается вопрос — почему? Если кто-нибудь сможет это объяснить, я был бы очень признателен.

Я подумал, что это может быть связано с тем, что фрейм должен быть создан в потоке отправки событий, но использование SwingUtilities.invokeLater или invokeAndWait не сработало.

Ответ №2:

Я думаю, вы столкнулись с проблемой фокусировки плагина: во многих современных браузерах плагин получает фокус только благодаря тому, что пользователь нажимает на него или использует Javascript. Обычно это влияет на Flash, но может случиться так, что это также влияет на апплеты. Попробуйте рекомендации Adobe на http://kb2.adobe.com/cps/155/tn_15586.html.

Дайте мне знать, работает ли это для вас.

Комментарии:

1. Я не смог заставить это работать. Я также попытался поискать в Интернете другие способы настройки фокуса на JavaScript. Я вставил одну из своих попыток ниже. У меня нет опыта работы с JavaScript, поэтому, возможно, я допустил ошибку. <html><head></head> <body onLoad=»window.document.Test.focus()»> <идентификатор апплета = «Test» name = «Test» code=»test/AppletTest.class «архив = «test.jar «> </applet> </body> </html>