2013-04-02 24 views
0

我必須製作2個面板,一個帶有停止和啓動按鈕,另一個顯示簡筆畫。當你按下開始它移動,停止它停止。當我按下開始時,我得到這個錯誤信息:線程「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; 
    } 
} 
+0

你能發佈完整的錯誤信息嗎? – CodeGuy

+0

異常在線程 「AWT-EventQueue的-0」 顯示java.lang.NullPointerException \t在Stick.actionPerformed(Stick.java:64) \t在javax.swing.AbstractButton.fireActionPerformed(未知來源) \t在javax.swing中。 AbstractButton的$ Handler.actionPerformed(來源不明) \t在javax.swing.DefaultButtonModel.fireActionPerformed(來源不明) \t在javax.swing.DefaultButtonModel.setPressed(來源不明) \t在javax.swing.plaf.basic.BasicButtonListener。 mouseReleased(未知來源) –

+0

太久無法發佈,但它只是繼續與未知的來源 –

回答

2

看起來myBanner對象爲空。意思是,你從來沒有初始化過任何地方。您可能需要在Stick構造函數中初始化它。

myBanner = new MovingBanner(); 

你還缺少Thread的建立,你已經實現了一個run方法。在MovingBanner的構造函數中,最後加上

new Thread(this).start(); 
+0

好吧nvm我把它放在th公共棒()區,但現在當我按下去它不顯示 –

+0

看起來像你從未開始線程 - 看到更新的答案 – CodeGuy

+0

我該怎麼做? –

相關問題