Ввод с клавиатуры в Java-апплете - PullRequest
4 голосов
/ 07 мая 2011

Каков наилучший способ прослушивания ввода с клавиатуры в 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);
    }
}

Ответы [ 2 ]

1 голос
/ 13 мая 2011

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

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

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

0 голосов
/ 07 мая 2011

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

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

...