Апплет не находит KeyEvents или получает фокус - PullRequest
0 голосов
/ 20 апреля 2011

Мой апплет никогда не фокусируется. Я запускаю его в затмении, или бросаю на своем веб-сервере, так или иначе, он никогда не фокусируется.

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

Это отображает контекст, хотя. Он просто генерирует несколько случайных картинок и отображает их.

Что мне нужно сделать, чтобы сосредоточиться и получить ключевые события?

Вот класс. Он был слегка урезан, но незначительно.

public class ClientMain extends Applet implements KeyListener, FocusListener {

    private Image offscreen;

    private Image primary; // the main view screen

    private ClientContext context;

    public void init() {
        setSize(800,600);
        setFocusable(true);

        offscreen = createImage(800, 600);

        primary = createImage(530,450);

        // for testing purposes. This just creates a random context
        context = ClientContext.generateRandomContext(); 

    }

    public void paint(Graphics g) {
        Graphics buffer = offscreen.getGraphics();
        buffer.clearRect(0,0,getWidth(),getHeight());

        drawPrimary(); 

        g.drawImage(offscreen, 0, 0, this);

    }

    private void drawPrimary() {
        Graphics g = primary.getGraphics();
        int w = primary.getWidth(null);
        int h = primary.getHeight(null);
        System.out.println("primary: " + w + " " + h);
        context.drawPrimary(g,w,h);
        offscreen.getGraphics().drawImage(primary,150,0,this);
    }

    public void update() {
        repaint();
    }

    public void mouseMoved(MouseEvent e) {
        repaint();
    }


    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("Key Pressed: " + e.getKeyCode());
        switch(e.getKeyCode()) {
        case KeyEvent.VK_UP: context.up(); break;
        case KeyEvent.VK_DOWN: context.down(); break;
        case KeyEvent.VK_LEFT: context.left(); break;
        case KeyEvent.VK_RIGHT: context.right(); break;
        }
        repaint();
    }

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

    }

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

    }

    @Override
    public void focusGained(FocusEvent e) {
        System.out.println("got focus");

    }

    @Override
    public void focusLost(FocusEvent e) {
        System.out.println("lost focus");

    }

}

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

Итак, я чувствую себя довольно глупо.

Я никогда не добавлял ключевого слушателя. Так что он захватывал события, но ничего с ними не делал.

Мне просто нужно было добавить это в мой init ()

addKeyListener(this);

... Дох!

0 голосов
/ 20 апреля 2011

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

// <applet code='GoodTouchApplet' width='400' height='400'></applet>
import java.awt.event.*;
import javax.swing.*;

public class GoodTouchApplet extends JApplet {

    JPanel gui;

    public void init() {
        gui = new JPanel();
        gui.setFocusable(true);
        KeyListener keyListener = new KeyAdapter(){
            public void keyTyped(KeyEvent keyEvent) {
                System.out.println(keyEvent);
            }
        };
        gui.addKeyListener(keyListener);

        setContentPane(gui);
    }

    public void start () {
        // Applets and focus are a 'mess'.  Best request it.
        gui.requestFocusInWindow();
    }
}

Протестировано и подтверждено работа в Java 6 SDKпрограмма для просмотра апплетов и последняя версия FF с версией 1.6.0_24.

0 голосов
/ 20 апреля 2011

Я ничего не знаю о AWT. Почему вы все еще пишете код AWT? Единственное, что я могу предложить, - всегда ли вызывать super.paint () при переопределении метода рисования.

Если вы решили написать апплет Swing, то вам следует знать, что код совершенно другой, а не просто вопрос расширения JApplet, поскольку рисование в Swing совершенно отличается от рисования в AWT. Может быть, начать с Как сделать апплеты учебник.

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

...