小程序未找到关键事件或获得焦点

时间:2011-04-20 01:37:19

标签: java applet focus

我的小程序永远不会获得焦点。我在eclipse中运行它,或者我把它扔在我的网络服务器上,无论哪种方式它都不会获得焦点。

我知道我的绘图机制是否不起作用,因为我写了这篇文章并且我仍在解决其中的问题。但是,我有一个调试消息,当我按下一个键时应该触发,并且当我获得焦点时应该触发的调试消息。永远都不会开火。

它显示了上下文。它只会生成一些随机图片并显示它们。

我需要做些什么来获得焦点并获得关键事件?

这是课程。它略有减少,但并不显着。

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 个答案:

答案 0 :(得分:1)

所以,我觉得很傻。

我从未添加过关键监听器。所以它抓住了这些事件,但它没有对它们做任何事情。

我只需要将它添加到我的init()

addKeyListener(this);

...... Doh!

答案 1 :(得分:0)

我对AWT一无所知。你为什么还在写AWT代码?唯一的想法是,我可以建议你在重写paint方法时应该总是调用super.paint()。

如果您决定编写Swing applet,那么您应该知道代码完全不同,而不仅仅是扩展JApplet,因为Swing中的绘制与AWT中的绘制完全不同。也许从How to Make Applets教程开始。

Swing中的applet就像Swing中的应用程序一样。您可以将组件添加到applet的内容窗格中。因此,如果要进行自定义绘制,可以为绘画创建自定义面板并将其添加到applet中。面板必须是可聚焦的,以便它能够接收KeyEvents。

答案 2 :(得分:0)

(抱怨)我看到你已经解决了它,但我准备了这个基于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 applet viewer&amp;最新版本的FF运行1.6.0_24。