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()放在更新构造函数中。