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