我的小程序永远不会获得焦点。我在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");
}
}
答案 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。