0

2 つのパネルを作成する必要があります。1 つには停止ボタンと開始ボタンがあり、もう 1 つにはスティック フィギュアが表示されます。スタートを押すと動き、止まると止まります。[開始] を押すと、次のエラー メッセージが表示されます: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at 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;
    }
}
4

1 に答える 1

2

myBannerオブジェクトが nullのようです。つまり、どこにも初期化していません。おそらくStickコンストラクターで初期化する必要があります。

myBanner = new MovingBanner();

また、メソッドをThread実装したの設定もありません。runのコンストラクターでMovingBanner、最後に追加します

new Thread(this).start();
于 2013-04-02T22:06:52.670 に答える