在fillPolygon / drawPolygon上使用 KeyListener 时似乎存在问题。我无法使用KeyListener移动多边形,但我可以移动其他图形。这是java代码:
import java.awt.Color;
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Exer09Laggui extends Applet implements KeyListener {
int width;
int height;
int carLength = 200;
int carWidth = 75;
int nPoints = 4;
// for body
int body_x = 0;
int body_y = 0;
// for front windshield
// x coordinates
int frontWS_x1 = 125;
int frontWS_x2 = 125;
int frontWS_x3 = 145;
int frontWS_x4 = 145;
// y coordinates
int frontWS_y1 = 62;
int frontWS_y2 = 10;
int frontWS_y3 = 5;
int frontWS_y4 = 67;
int[] xPoints1 = { frontWS_x1, frontWS_x2, frontWS_x3, frontWS_x4 };
int[] yPoints1 = { frontWS_y1, frontWS_y2, frontWS_y3, frontWS_y4 };
public void init() {
width = getSize().width;
height = getSize().height;
setBackground(Color.GRAY);
addKeyListener(this);
}
public void paint(Graphics g) {
// for the car body
g.setColor(Color.BLACK);
// fillRoundRect(int x, int y, int width, int height, int arcWidth, int
// arcHeight)
g.fillRoundRect(body_x, body_y, carLength, carWidth, 30, 30);
// for the front windshield
// fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
g.setColor(Color.white);
g.drawPolygon(xPoints1, yPoints1, nPoints);
g.setColor(new Color(200, 200, 255));
g.fillPolygon(xPoints1, yPoints1, nPoints);
}
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;
}
repaint();
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
这里是html ...我不知道出了什么问题,请帮忙......
<html>
<body>
<applet code = 'Exer09Laggui.class'
width = '1340'
height = '635'/>
</body>
</html>
答案 0 :(得分:1)
这是一个焦点问题,关键是在applet 可见之后将重点放在上,而后一部分是棘手的部分,因为只需在{{{{}}中调用requestFocus()
1}}方法不起作用。您可以在init中的Swing Timer中执行此操作,或覆盖setVisible,如下所示为kludge 1或kludge 2:
init()
调试这些类型的东西时的另一个技巧是尽可能简化代码,以便只保留演示错误所需的必需品。哪些代码更易于我们阅读和理解,您的代码或更简单的代码 - 您将会明白为什么这对我们有帮助。它对你有帮助,因为你消除了可能使问题复杂化的事情,从而处理纯粹的问题。
修改强>
要移动“挡风玻璃”,您需要更新挡风玻璃用于绘制的数据。那是什么数据?两个int []数组,xPoints1和yPoints1。由于您的代码不会改变这些,因此挡风玻璃将保留在原位。您需要添加以下内容:
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) {
}
}
答案 1 :(得分:1)
数组值不会自动更新,因为它们是基元,而不是对象。
// <applet code='Exer09Laggui' width=400 height=200></applet>
import java.awt.Color;
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Exer09Laggui extends Applet implements KeyListener {
int width;
int height;
int carLength = 200;
int carWidth = 75;
int nPoints = 4;
// for body
int body_x = 0;
int body_y = 0;
// for front windshield
// x coordinates
int frontWS_x1 = 125;
int frontWS_x2 = 125;
int frontWS_x3 = 145;
int frontWS_x4 = 145;
// y coordinates
int frontWS_y1 = 62;
int frontWS_y2 = 10;
int frontWS_y3 = 5;
int frontWS_y4 = 67;
int[] xPoints1 = { frontWS_x1, frontWS_x2, frontWS_x3, frontWS_x4 };
int[] yPoints1 = { frontWS_y1, frontWS_y2, frontWS_y3, frontWS_y4 };
public void init() {
width = getSize().width;
height = getSize().height;
setBackground(Color.GRAY);
addKeyListener(this);
setFocusable(true);
requestFocusInWindow();
}
public void paint(Graphics g) {
// for the car body
g.setColor(Color.BLACK);
// fillRoundRect(int x, int y, int width, int height, int arcWidth, int
// arcHeight)
g.fillRoundRect(body_x, body_y, carLength, carWidth, 30, 30);
// for the front windshield
// fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
g.setColor(Color.white);
g.drawPolygon(xPoints1, yPoints1, nPoints);
g.setColor(new Color(200, 200, 255));
g.fillPolygon(xPoints1, yPoints1, nPoints);
}
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;
}
xPoints1[0] = frontWS_x1;
xPoints1[1] = frontWS_x2;
xPoints1[2] = frontWS_x3;
xPoints1[3] = frontWS_x4;
yPoints1[0] = frontWS_y1;
yPoints1[1] = frontWS_y2;
yPoints1[2] = frontWS_y3;
yPoints1[3] = frontWS_y4;
repaint();
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}