有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java绘图字符串不是绘图字符串

您好,我目前正在学习java游戏开发,当我运行它运行但不绘制字符串的代码时,它在线程“main”java中给了我这个错误异常。lang.NullPointerException 在代码处。果心render(Core.java:62) 在代码处。果心run(Core.java:69) 在代码处。果心开始(Core.java:27) 在代码处。果心main(Core.java:45)

这是我的密码

package Code;

import java.applet.Applet;
import java.awt.*;
import java.awt.image.VolatileImage;

import javax.swing.*;

public class Core extends Applet implements Runnable{   
////////////////////////////////////////////////////////////////////
    double x, y, Cx, Cy;

    public static boolean isRunning = false;

    static JFrame frame;

    public static Core core = new Core();

    public Image i = new ImageIcon("res/Google.jpg").getImage();

    public VolatileImage screen;
////////////////////////////////////////////////////////////////////


    public void start() {
        isRunning = true;
        core.run();
    }

    public void stop() {
        isRunning = false;
    }

    public static void main(String[] args) {
        frame = new JFrame();

        frame.add(core);
        frame.setUndecorated(true);
        frame.pack();
        frame.setResizable(false);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        core.start();


    }



    public void tick() {
        System.out.println("tick");
    }

    public void render() {
        Graphics g = null;
        System.out.println("render");
        setBackground(Color.PINK);
        setForeground(Color.WHITE);

        g.drawString("Test", 500, 500);

    }

    public void run() {
        while(isRunning){
            tick();
            render();
            try{Thread.sleep(5);}catch(Exception e){isRunning = false;}

        }

    }
}

共 (2) 个答案

  1. # 1 楼答案

    public void render() {
        Graphics g = null;              // uh oh.
        System.out.println("render");
        setBackground(Color.PINK);
        setForeground(Color.WHITE);
        g.drawString("Test", 500, 500); // g is null here.
    }
    

    您直接将g赋值给null,然后对其调用一个方法。这会给你一个NPE

  2. # 2 楼答案

    1. 您正在从Applet扩展,但创建了一个JFrame来容纳它。建议混合使用重型和轻型组件,更不用说在框架中添加小程序了
    2. 您正在创建一个长时间运行的循环,而不考虑正在运行它的线程的上下文,这可能会导致它阻止事件调度线程,从而阻止任何可能的绘制更新(以及其他事情)
    3. 你的渲染方法没有有效的Graphics内容来绘制

    首先,创建一个可以绘制的自定义组件(例如从JPanel扩展而来)。然后,您可以决定在哪里显示它,例如在小程序或框架上

    查看Performing Custom Painting了解如何在Swing中进行绘制的详细信息

    查看Concurrency in Swing了解有关如何执行长时间运行的任务以及如何从事件调度线程的外部上下文更新UI的详细信息