Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图让一个棒状图形在屏幕上移动,收到一条错误消息_Java_Swing_Object_Animation_Jpanel - Fatal编程技术网

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

Java 试图让一个棒状图形在屏幕上移动,收到一条错误消息,java,swing,object,animation,jpanel,Java,Swing,Object,Animation,Jpanel,我必须制作两个面板,一个带有停止和开始按钮,另一个显示棍状图形。当你按下开始按钮时,它移动,停止。当我按下Start键时,会收到以下错误消息:线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 在Stick.actionPerformed(Stick.java:64) 指向这一行的:myBanner.startAnimation() 所以Banner类的startAnimation函数显然有问题,但我不确定。有没有办法让这东西运转起来

我必须制作两个面板,一个带有停止和开始按钮,另一个显示棍状图形。当你按下开始按钮时,它移动,停止。当我按下Start键时,会收到以下错误消息:线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 在Stick.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;
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.BoxLayout;
公共类Stick扩展JFrame实现ActionListener{
公共静态最终整数帧_宽度=500;
专用静态最终整型框架高度=500;
私有静态最终整数帧×原点=150;
私有静态最终整数帧_Y_原点=200;
按钮停止,开始;
图形g;
移动旗帜我的旗帜;
螺纹螺纹;
公共静态void main(字符串[]args){
斗杆框架=新斗杆();
frame.setVisible(true);
}
公共棍棒{
容器内容窗格;
contentPane=getContentPane();
setLayout(新的FlowLayout());
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置尺寸(框宽、框高);
setVisible(真);
g=contentPane.getGraphics();
JPanel小组1、小组2;
panel1=新的JPanel(新的FlowLayout());
panel2=新的JPanel(新的FlowLayout());
contentPane.add(panel1);
contentPane.add(panel2);
停止=新按钮(“停止”);
go=新的JButton(“go”);
stop.addActionListener(this);
go.addActionListener(这个);
第1组:添加(go);
面板1.添加(停止);
}
已执行的公共无效操作(操作事件){
if(JButton的event.getSource()instanceof){
JButton clickedButton=(JButton)event.getSource();
如果(单击按钮==开始){
myBanner.startAnimation();
thrd=新线程(myBanner);
thrd.start();
}
如果(单击按钮==停止){
myBanner.stopAnimation();
thrd=null;
}
}
}
}
类MovingBanner扩展JPanel实现可运行{
私人INTX;
公共静态最终整数帧_宽度=500;
专用静态最终整型框架高度=500;
私有静态最终整数帧×原点=150;
私有静态最终整数帧_Y_原点=200;
int bodyX=250;
int BODY1=160;
int body2=210;
int臂高=190;
int armLength=bodyX+30;
int armLength1=车身X-30;
int-legY=110;
私有布尔动画;
公共移动横幅(){
x=2;
动画=真;
}
公共组件(图形g){
超级组件(g);
g、 抽绳(车身x+x,车身Y1,车身x+x,车身Y2);//车身
g、 Draw椭圆形(bodyX+x,bodyY2,40,40);//头部
g、 抽绳(臂长+x,臂高,臂长1+x,臂高);//臂
g、 抽绳(bodyX+x,bodyY1,bodyX+20+x,legY);//腿
g、 抽绳(bodyX+x,bodyY1,bodyX-20+x,legY);//腿
}
公开募捐{
while(动画){
changeX();
重新油漆();
试试{Thread.sleep(100);}catch(异常e){};
}
}
公共无效changeX(){

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

myBanner = new MovingBanner();
您还缺少已为其实现
run
方法的
线程的设置。在
MovingBanner
的构造函数中,最后添加

new Thread(this).start();

您可以发布完整的错误消息吗?线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常在javax.swing.AbstractButton.fireActionPerformed(未知源)中的Stick.actionPerformed(Stick.java:64)在javax.swing.AbstractButton$Handler中的异常在javax.swing.DefaultButtonModel.fireActionPerformed中的actionPerformed(未知源)(未知源代码)javax.swing.DefaultButtonModel.setPressed(未知源代码)javax.swing.plaf.basic.BasicButtonListener.MouseRelease(未知源代码)太长,无法发布其余内容,但它只是继续使用未知源代码Sokay nvm,我将其放在公共棒()中区域,但现在当我按下go键时,它没有显示。我这样放置它,但它仍然没有显示?public MovingBanner(){x=2;animate=true;new Thread(this).start();}