2016-03-21 6 views
0

私はPongを作ろうとしています。私はこのプログラムを友人に送りました。初めて彼が走ったとき、彼は私のバグを得ましたが、後でそれはうまくいったのです。私はいつもバグを取得しているようだ。私のパドルは上下に動くことができます。それは正しく動いているように見え、正しい場所に描画されますが、常に開始位置に点滅して再び戻ります。開始位置で1回、次に右側の位置で描画されるように見え、2つの位置の間で永遠に点滅します。Netbeansを使ってピンポン用のパドルを完全に描くのに問題があります

NetBeansはthis.addKeyListener(this);について不平を言っています。それは "これをコンストラクターでリーク"と言います。誰が見てみたい場合、私は、NetBeansからそれをエクスポート

(事前、初めての投稿で申し訳ありません):ここに私のコードです http://s000.tinyupload.com/?file_id=00856291054786890080

public class LeikGluggi extends javax.swing.JPanel implements ActionListener, KeyListener { 
    Spilari1 spilari1 = new Spilari1();//make paddle 
    Bolti bolti = new Bolti(); //make ball 

    public LeikGluggi() { 
     initComponents(); 
     setSize(Leikbord.GLUGGI_BREIDD,Leikbord.GLUGGI_HAED); 
     this.addKeyListener(this); 
     this.setFocusable(true); 
     int i = 0; 
     Timer tim = new Timer(50, this); 
     tim.start(); 

    } 
    private void uppfaera()//update 
    { 
     spilari1.uppfaera();//paddle update 
     bolti.uppfaera(); // ball update 

    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g);// 
     g.setColor(Color.WHITE); 
     g.fillRect(0,0,Leikbord.GLUGGI_BREIDD,Leikbord.GLUGGI_HAED); //background 



     g.setColor(Color.BLUE); 
     spilari1.paint(g);  //paddle drawn 
     bolti.paint(g);   //ball drawn 


    } 


    @Override 
    public void actionPerformed(ActionEvent e) 
    { 

     uppfaera();//update called 

     repaint(); 

    } 

    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     if (e.getKeyCode() == KeyEvent.VK_UP) 
     { 
      spilari1.setyHradi(-4); 
     } 
     else if (e.getKeyCode() == KeyEvent.VK_DOWN) 
     { 
      spilari1.setyHradi(4); 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) 
    { 
     if (e.getKeyCode() == KeyEvent.VK_UP) 
     { 
      spilari1.setyHradi(0); 
     } 
     if (e.getKeyCode() == KeyEvent.VK_DOWN) 
     { 
      spilari1.setyHradi(0); 
     } 
    } 

    public void keyTyped(KeyEvent e) 
    { 
    } 

そして、私のパドル パッケージ用のコードです。 hi.vidmotsforritun.pong2.teikning;

import java.awt.Color; 
import java.awt.Graphics; 


public class Spilari1 { 

    private final int breidd = 10 ; 
    private final int lengd = 75; 
    private int y = (Leikbord.GLUGGI_HAED/2)-lengd/2; 
    private int yHradi = 0; 


    public Spilari1() 
    { 
    } 

    public void uppfaera() 
    { 
     y = y + yHradi; 
     System.out.println("HRAÐI ER "+yHradi); 
    } 
    public void paint(Graphics g) 
    { 
     g.setColor(Color.BLUE); 
     g.fillRect(25, y, breidd, lengd); 
     System.out.println("Y er "+y); 

    } 
     public void setyHradi(int hradi) 
    { 
     yHradi = hradi; 
    } 



} 
+0

オブジェクト(キーリスナー)に渡されたオブジェクトが完全に無効になることがあり、コンストラクタが完了する前に "this"オブジェクトのプロパティにアクセスしようとします。この特定のケースでは、それは問題でなければなりません – MadProgrammer

+0

パドルウィンドウ内のyを私設intからpublic staticにチェインすることによって私のプログラムを修正することができました。私はなぜそれが私の問題を解決したのか分かりませんが、それは...私はまだ聴取者の問題について心配しています。 – snjall

答えて

0

このスレッド(「http://forums.netbeans.org/post-134877.html」)によると、問題は完全に(コンストラクタで)初期化されていない間、あなたは外のクラスにこのの参照を渡すことです。したがって、後で初期化メソッドでこれを行う必要があります

+0

あなたが矛盾している場合は、帽子が時間とアクションリスナーを分ける最善の方法だとお考えですか? – snjall

+0

おそらく、init()のようなメソッドを使用します。ここでは、actionlistener行を入れ、コンストラクタを呼び出した後にその行を外部から呼び出します。 LeikGluggiのようにl =新しいLeikGluggi; l.init(); – divandc

関連する問題