2016-03-25 15 views
0

私はYouTubeビデオで使用するような 'Troll'のようなアプリケーションを作成しており、JFrameを1/2秒ごとに画面にジャンプさせたいとします。相続人.setLocationがタイマーで動作しない

私のコード:

package troll1; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.Timer; 

public class troll extends JFrame implements ActionListener{ 
    private static final long serialVersionUID = 1L; 

    public static void main(String args[]) { 
     troll w1 = new troll(); 
     w1.setVisible(true); 
     w1.setSize(500,500); 
    } 

    public Random ran; 
    public int random; 
    public troll w1; 
    public Timer t; 

    public troll() { 
     Timer t = new Timer(500, this); 
     t.start(); 

    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     Random ran = new Random(); 

     for(int counter=1; counter<=1;counter++) { 
      int random = 1+ran.nextInt(500); 
      w1.setLocation(random, random); 
     } 

    } 

} 

問題であり、私はこのコードを実行すると、私はこのエラーがなくなって得れば、私が作るだろう、また、エラーが言っ

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at troll1.troll.actionPerformed(troll.java:37) 
    at javax.swing.Timer.fireActionPerformed(Unknown Source) 
    at javax.swing.Timer$DoPostEvent.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 

を取得そのため、JFrameは500,500以下でなく、画面全体にジャンプします。

+0

アクションリスナーの 'w1'は決してインスタンス化されません。あなたは可変スコープについて混乱しているようです。あなたはローカル変数と同じ名前のクラスメンバーを持っています(main()のw1はあなたのクラスのw1と同じ参照ではありません)アクションリスナーの 'run'参照と同じです。あなたのコンストラクタ)。 – Cypher

+0

どのように私はそれを見て、私はまだ見つけることができません。 – Jbot

+1

http://www.java-made-easy.com/variable-scope.html – Cypher

答えて

0

w1変数は常にnullです。これをactionPerformedで使用すると、このように動作させることができます。

@Override 
public void actionPerformed(ActionEvent arg0) { 
    Random ran = new Random(); 

    for(int counter=1; counter<=1;counter++) { 
     int random = 1+ran.nextInt(500); 
     this.setLocation(random, random); 
    } 

} 
関連する問題