Это проблема фокуса, и ключ заключается в том, чтобы сфокусироваться на апплете после того, как он виден , а последняя часть - сложная часть, так как просто вызов requestFocus()
в методе init()
выигралне работаетВы можете сделать это в Swing Timer в init или переопределить setVisible, как показано ниже как kludge 1 или kludge 2:
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;
public class Exer09Laggui extends Applet implements KeyListener {
private boolean firstSetVisible = true;
public void init() {
addKeyListener(this);
// kludge one:
int timerDelay = 400;
new javax.swing.Timer(timerDelay , new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Exer09Laggui.this.requestFocusInWindow();
((javax.swing.Timer)evt.getSource()).stop();
}
}).start();
}
// kludge two
public void setVisible(boolean b) {
super.setVisible(b);
if (firstSetVisible) {
requestFocusInWindow();
firstSetVisible = false;
}
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
JOptionPane.showMessageDialog(this, "down");
}
if (e.getKeyCode() == KeyEvent.VK_UP) {
JOptionPane.showMessageDialog(this, "up");
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
JOptionPane.showMessageDialog(this, "left");
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
JOptionPane.showMessageDialog(this, "right");
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
Еще одна хитрость при отладке этих типов вещей - максимально упростить ваш кодтак что остаются только основные элементы, необходимые для демонстрации ошибки.Какой код нам легче читать и понимать, ваш код или мой более простой код - и вы поймете, почему это полезно для нас.это также полезно для вас, поскольку вы устраняете вещи, которые могут усложнить проблему и тем самым справиться только с чистой проблемой.
Редактировать
Чтобы переместить «лобовое стекло», необходимо обновитьданные, которые использует лобовое стекло для рисования.Что это за данные?Два массива int [], xPoints1 и yPoints1.Поскольку ваш код не меняет их, то ветровые стекла останутся на месте.Вам нужно добавить что-то вроде:
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
// for body
body_y += 5;
// for front windshield
frontWS_y1 += 5;
frontWS_y2 += 5;
frontWS_y3 += 5;
frontWS_y4 += 5;
}
if (e.getKeyCode() == KeyEvent.VK_UP) {
// for body
body_y -= 5;
// for front windshield
frontWS_y1 -= 5;
frontWS_y2 -= 5;
frontWS_y3 -= 5;
frontWS_y4 -= 5;
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
// for body
body_x -= 5;
// for front windshield
frontWS_x1 -= 5;
frontWS_x2 -= 5;
frontWS_x3 -= 5;
frontWS_x4 -= 5;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
// for body
body_x += 5;
// for front windshield
frontWS_x1 += 5;
frontWS_x2 += 5;
frontWS_x3 += 5;
frontWS_x4 += 5;
}
// ***** note added code *****
xPoints1 = new int[]{ frontWS_x1, frontWS_x2, frontWS_x3, frontWS_x4 };
yPoints1 = new int[]{ frontWS_y1, frontWS_y2, frontWS_y3, frontWS_y4 };
repaint();
}