Java 如何修复可以';不使用get/set方法吗? 所以我需要在StaticGUI中创建的图形变量用于更新。。。get/set方法已退出,它在两个不同的线程上运行,我不知道。。。
编辑:还有,有没有比使用画布更好的方法 主要类别:Java 如何修复可以';不使用get/set方法吗? 所以我需要在StaticGUI中创建的图形变量用于更新。。。get/set方法已退出,它在两个不同的线程上运行,我不知道。。。,java,class,graphics,nullpointerexception,2d,Java,Class,Graphics,Nullpointerexception,2d,编辑:还有,有没有比使用画布更好的方法 主要类别: package sanity; public class Client { int X = 1024; int Y = 680; StaticGUI gui; public void launch() { gui = new StaticGUI(); gui.draw(); } public static void main(String[] args
package sanity;
public class Client {
int X = 1024;
int Y = 680;
StaticGUI gui;
public void launch() {
gui = new StaticGUI();
gui.draw();
}
public static void main(String[] args) {
Client game = new Client();
game.launch();
Thread t = new Thread(new Update());
t.start();
}
}
使用图形变量初始化:
package sanity;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
class StaticGUI extends Client {
JFrame mainWin;
Canvas UI;
BufferStrategy Buffer;
Graphics g;
Graphics2D g2d;
public StaticGUI() {
mainWin = new JFrame("Game");
UI = new Canvas();
}
void draw() {
mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWin.setIgnoreRepaint(true);
UI.setIgnoreRepaint(true);
UI.setBounds(0, 0, X, Y);
UI.setBackground(Color.WHITE);
mainWin.add(UI);
mainWin.pack();
mainWin.setResizable(false);
mainWin.setLocationRelativeTo(null);
mainWin.setVisible(true);
UI.createBufferStrategy(2);
Buffer = UI.getBufferStrategy();
g = Buffer.getDrawGraphics();
g2d = (Graphics2D) g;
}
}
我需要它们的类:
package sanity;
import java.awt.*;
public class Update extends StaticGUI implements Runnable {
public Update() {
}
@Override
public void run() {
System.out.println(X + "," + Y);
g2d.setColor(Color.black);
g2d.fillRect(0, 0, X, Y);
g.dispose();
Buffer.show();
}
}
如我所见,我认为您可以调用
g2d.setColor(Color.black)代码>在g2d初始化之前。我相信在此之前您没有调用StaticGUI
的draw()
。我知道您在lauch()中调用客户机的draw(),但您是为客户机调用它,而不是为StaticGUI
或Update
调用它,在那里使用了draw()
的新实现。那么,我不确定,但我想
System.out.println(X+,“+Y)
draw()
g2d.setColor(Color.black)代码>
将解决问题,因为它应该调用StaticGUI的draw()。(如果我错了,请纠正我:)据我所知,您创建了一个客户端实例(称为“game”),并调用其launch()方法,该方法在该实例上启动draw(),稍后的调用将初始化其g2d成员。稍后,您将创建另一个客户端实例(使用new Update()),该实例将尝试访问此稍后实例的g2d成员。该成员不是在这里初始化的。这两个实例是不同的,它们不共享成员的值(g2d也不是静态的)。
要么将该成员设置为静态(这通常是一种不好的做法),要么也应该在第二个客户端上调用draw() 在上面的哪一行中可以得到NullPointerException?g2d.setColor(Color.black);-更新类第13行此方法通过每次运行调用draw,包含不可忽略的开销。我会将g2d赋值放在StaticGUI
构造函数中。它可以工作,但我想让draw()在主线程中运行,我想知道是否可以使用静态变量将它们传递给更新?或者这是一个糟糕的实现?@jma127,是的,这很好,但是由于g没有被初始化,它仍然给出null。。。把g放在那里,缓冲区出错,把它放上去,对等错误…我想我会把draw()放在更新构造函数中。