Java 如何修复VK_uu问题和NullPointerException?
无论如何,它是线程“AWT-EventQueue-0”java.lang.NullPointerException中的一个异常,我想知道我是否应该得到它。它不是每次都发生,但有时会发生。如果没有,我将如何着手修复它 此外,我还使用event.VK u键来设置上、下、左、右箭头键,但它不起作用。上面写着“访问静态字段”。我该怎么办Java 如何修复VK_uu问题和NullPointerException?,java,race-condition,Java,Race Condition,无论如何,它是线程“AWT-EventQueue-0”java.lang.NullPointerException中的一个异常,我想知道我是否应该得到它。它不是每次都发生,但有时会发生。如果没有,我将如何着手修复它 此外,我还使用event.VK u键来设置上、下、左、右箭头键,但它不起作用。上面写着“访问静态字段”。我该怎么办 谢谢 我会在BuffereImage中绘制背景,然后在JPanel的paintComponent中绘制BuffereImage。您可以在此处了解如何执行以下操作: 例如
谢谢 我会在BuffereImage中绘制背景,然后在JPanel的paintComponent中绘制BuffereImage。您可以在此处了解如何执行以下操作: 例如,使用已创建的代码:
Graphics2D gd = bufImg.createGraphics();
我会在BuffereImage中绘制背景,然后在JPanel的paintComponent中绘制BuffereImage。您可以在此处了解如何执行以下操作: 例如,使用已创建的代码:
Graphics2D gd = bufImg.createGraphics();
你能发布完整的堆栈跟踪吗?你确定这一行有NPE吗?如果是这样的话,bufImg是空的,这只能发生在无法在ctor中创建图形上下文的情况下。@Jeremy Heiler我确实把它放在了那里,其余的都没用了。你只需要知道它是“NPE”,我想这只是因为一开始它是空的,但后来它又添加了一些东西。除了event.VK uu的东西之外,游戏运行得很好……如果你只是按照Swing graphics教程的建议,使用JPanel的paintComponent方法进行绘制,则不需要进行双缓冲扭曲。默认情况下,JComponents是双缓冲的。另外,在绘制组件中创建缓冲区并绘制缓冲区有什么好处?减慢绘制组件的速度时,将失去所有好处。我建议您阅读教程。@Jochen Bedersdorfer我的游戏运行良好,正如我上面所说。。。这只会偶尔发生一次。。。但即使在那时,游戏仍然有效。。。那么这是一个问题吗?你能发布完整的堆栈跟踪吗?你确定这一行中有NPE吗?如果是这样的话,bufImg是空的,这只能发生在无法在ctor中创建图形上下文的情况下。@Jeremy Heiler我确实把它放在了那里,其余的都没用了。你只需要知道它是“NPE”,我想这只是因为一开始它是空的,但后来它又添加了一些东西。除了event.VK uu的东西之外,游戏运行得很好……如果你只是按照Swing graphics教程的建议,使用JPanel的paintComponent方法进行绘制,则不需要进行双缓冲扭曲。默认情况下,JComponents是双缓冲的。另外,在绘制组件中创建缓冲区并绘制缓冲区有什么好处?减慢绘制组件的速度时,将失去所有好处。我建议您阅读教程。@Jochen Bedersdorfer我的游戏运行良好,正如我上面所说。。。这只会偶尔发生一次。。。但即使在那时,游戏仍然有效。。。这是个问题吗?
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class GameStartJPanel extends JPanel {
private final static int WIDTH = 400, HEIGHT = 400;
private final static Rectangle left = new Rectangle(0, 0, WIDTH / 10, HEIGHT);
private final static Rectangle right = new Rectangle((WIDTH / 10) * 9, 0, WIDTH / 5, HEIGHT);
private final static Rectangle top = new Rectangle(0, 0, WIDTH, HEIGHT / 8);
private final static Rectangle bottom = new Rectangle(0, (HEIGHT / 15) * 14, WIDTH, HEIGHT / 9);
private final static Rectangle topInr = new Rectangle((WIDTH / 11) * 2, (HEIGHT / 16) * 3, (WIDTH / 14) * 9,
HEIGHT / 10);
private final static Rectangle bottomInr = new Rectangle((WIDTH / 11) * 2, (HEIGHT / 16) * 12, (WIDTH / 14) * 9,
HEIGHT / 10);
private final static Rectangle leftInr = new Rectangle((WIDTH / 11) * 2, HEIGHT / 5, WIDTH / 5, (HEIGHT / 10) * 6);
private final static Rectangle rightInr = new Rectangle((WIDTH / 12) * 6, (HEIGHT / 20) * 7, WIDTH / 2,
(HEIGHT / 10) * 3);
private final static Rectangle finishLine = new Rectangle(WIDTH / 10, (HEIGHT / 10) * 8, WIDTH / 10, HEIGHT / 70);
private final static Rectangle checkPoint = new Rectangle((WIDTH / 25) * 9, (HEIGHT / 10) * 5, WIDTH / 7, HEIGHT / 70);
private final static Rectangle carOne = new Rectangle(WIDTH / 8, HEIGHT / 2, WIDTH / 30, WIDTH / 30);
private final static Rectangle carTwo = new Rectangle(WIDTH / 9, HEIGHT / 2, WIDTH / 30, WIDTH / 30);
private BufferedImage backgroundImage;
public GameStartJPanel() {
backgroundImage = createBackgroundImage();
setPreferredSize(new Dimension(WIDTH, HEIGHT));
}
private BufferedImage createBackgroundImage() {
BufferedImage bckgdImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D gd = bckgdImage.createGraphics();
try {
gd.clearRect(0, 0, WIDTH, HEIGHT);
gd.setColor(Color.RED);
gd.fillRect(finishLine.x, finishLine.y, finishLine.width, finishLine.height);
gd.setColor(Color.LIGHT_GRAY);
gd.fillRect(left.x, left.y, left.width, left.height);
gd.fillRect(right.x, right.y, right.width, right.height);
gd.fillRect(top.x, top.y, top.width, top.height);
gd.fillRect(bottom.x, bottom.y, bottom.width, bottom.height);
gd.fillRect(topInr.x, topInr.y, topInr.width, topInr.height);
gd.fillRect(bottomInr.x, bottomInr.y, bottomInr.width, bottomInr.height);
gd.fillRect(leftInr.x, leftInr.y, leftInr.width, leftInr.height);
gd.fillRect(rightInr.x, rightInr.y, rightInr.width, rightInr.height);
// do this in the paintComponent method
// gd.setColor(Color.GREEN);
// gd.draw(carOne);
// gd.setColor(Color.PINK);
// gd.draw(carTwo);
} finally {
gd.dispose();
}
return bckgdImage;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (backgroundImage != null) {
g.drawImage(backgroundImage, 0, 0, null);
}
Graphics2D g2 = (Graphics2D) g;
g.setColor(Color.GREEN);
g2.draw(carOne);
g.setColor(Color.PINK);
g2.draw(carTwo);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("GameStartJPanel");
frame.getContentPane().add(new GameStartJPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}