有 Java 编程相关的问题?

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

java试图让一个棒状图形在屏幕上移动,得到一条错误消息

我必须制作两个面板,一个带有停止和开始按钮,另一个显示棍状图形。当你按下开始按钮时,它移动,停止。当我按下Start键时,我收到以下错误消息:线程“AWT-EventQueue-0”java中出现异常。lang.NullPointerException 在棍子上。actionPerformed(Stick.java:64)

指向这条线:myBanner。startAnimation()

所以Banner类的startAnimation函数显然有问题,但我不确定。有没有办法让这东西运转起来

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.BoxLayout;
public class Stick extends JFrame implements ActionListener{
    public static final int FRAME_WIDTH = 500;
    private static final int FRAME_HEIGHT = 500;
    private static final int FRAME_X_ORIGIN = 150;
    private static final int FRAME_Y_ORIGIN  = 200;


    JButton stop, go;
    Graphics g;


    MovingBanner myBanner;
    Thread thrd;
    public static void main(String[] args){
        Stick frame = new Stick();
        frame.setVisible(true);

    }


    public Stick(){
        Container contentPane;
        contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(FRAME_WIDTH,FRAME_HEIGHT);
        setVisible(true);

        g = contentPane.getGraphics();



        JPanel panel1, panel2;


        panel1 = new JPanel(new FlowLayout());
        panel2 = new JPanel(new FlowLayout());

        contentPane.add(panel1);
        contentPane.add(panel2);

        stop = new JButton("STOP");
        go = new JButton("GO");
        stop.addActionListener(this);
        go.addActionListener(this);
        panel1.add(go);
        panel1.add(stop);


    }
    public void actionPerformed(ActionEvent event){
        if (event.getSource() instanceof JButton){
            JButton clickedButton = (JButton) event.getSource();
            if(clickedButton == go){
                myBanner.startAnimation();
                thrd = new Thread (myBanner);
                thrd.start();           
            }
            if(clickedButton == stop){
                myBanner.stopAnimation();
                thrd = null;
            }
        }
    }
}

class MovingBanner extends JPanel implements Runnable{
    private int x;

    public static final int FRAME_WIDTH = 500;
    private static final int FRAME_HEIGHT = 500;
    private static final int FRAME_X_ORIGIN = 150;
    private static final int FRAME_Y_ORIGIN  = 200;

    int bodyX = 250;
    int bodyY1 = 160;
    int bodyY2 = 210;
    int armHeight = 190;
    int armLength = bodyX + 30;
    int armLength1 = bodyX - 30;
    int legY = 110;

    private Boolean animate;
    public MovingBanner(){
        x = 2;
        animate = true;
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawLine(bodyX + x, bodyY1, bodyX + x, bodyY2); //body
        g.drawOval(bodyX + x, bodyY2, 40, 40); //head
        g.drawLine(armLength + x,armHeight,  armLength1 + x, armHeight); //arms
        g.drawLine(bodyX + x, bodyY1, bodyX + 20 + x,legY); //leg
        g.drawLine(bodyX + x, bodyY1, bodyX - 20 + x, legY);    //leg
    }
    public void run(){
        while (animate){
            changeX();
            repaint();
            try {Thread.sleep(100); } catch(Exception e){};
        }
    }
    public void changeX() {

        if (x <= FRAME_WIDTH)
             x++;
        else x = 2;

    }
    public void stopAnimation() {
        animate = false;
    }

    public void startAnimation() {
        animate = true;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    似乎myBanner对象为空。也就是说,你从未在任何地方初始化过它。您可能需要在Stick构造函数中初始化它

    myBanner = new MovingBanner();
    

    您还缺少Thread的设置,您已经为其实现了run方法。在MovingBanner的构造函数中,在末尾添加

    new Thread(this).start();