2017-09-07 4 views
1

こんにちは私は煉瓦ブレーカゲームを作成しようとしています。 Real_Mainと呼ばれるメインクラスと、JPanelを拡張するReal_Createという別のクラスがあります。私のコードが正しいように感じるが、右と左の矢印キーで四角形を動かすことができない。誰がそれに間違っているのか教えてもらえますか?そして、長方形を動かすためにタイマーが必要なのはなぜですか?長方形が動いていない

import javax.swing.JFrame; 
public class Real_Main { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JFrame jf= new JFrame(); 

     Real_Create panel=new Real_Create(); 

     jf.setSize(500, 500); 
     jf.setVisible(true); 
     jf.setResizable(false); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.add(panel); 

    } 

} 

Real_Create:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Real_Create extends JPanel implements KeyListener,ActionListener { 

    int baseX=200; 

    int ballX=250; 
    int ballY=250; 
    int delay=20; 

    Timer tim; 


    Boolean play=false; 


    public Real_Create(){ 

     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 

     tim=new Timer(delay,this); 

     tim.start(); 

    } 


    public void paint(Graphics g){ 

     //background 
     g.setColor(Color.black); 
     g.fillRect(1,1,500,500); 

     //baseplayer 

     g.setColor(Color.white); 
     g.fillRect(baseX, 430, 80, 10); 

     //ball 
     g.setColor(Color.green); 
     g.fillOval(ballX, ballY, 20, 20); 


     g.dispose(); 




    } 



    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 
     tim.start(); 
     repaint(); 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     // TODO Auto-generated method stub 

     if(e.getKeyCode()== KeyEvent.VK_RIGHT){ 

      if(baseX >=420){ 

       baseX=420; 
      } 

      else{ 

       moveRight(); 
      } 

     } 

     if(e.getKeyCode()== KeyEvent.VK_LEFT){ 

      if(baseX <=0){ 

       baseX=0; 
      } 

      else{ 

       moveLeft(); 
      } 

     } 


    } 




    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

public void moveRight(){ 

     play=true; 
     baseX+=10; 
    } 

    public void moveLeft(){ 

     play=true; 
     baseX-=10; 
    } 
} 

ゲームから画像:

Image from the game

+0

私はちょうどあなたのコードをテストし、私のためのrectは完全に動作します。あなたのスクリーンショットプログラムのためだけかもしれませんが、イメージにはウィンドウにフォーカスがありません。キーリストが機能するためには、ウィンドウをクリックしてみる必要があります。 また、Rectを動かすためのタイマーが必要ではありません.20 msごとにウィンドウを再描画する瞬間には、キーを押した後に再描画を呼び出すこともできますが、アニメーションを作成しようとすると便利ですボール。 – Gumbo

答えて

0

あなたが扱っている何がスレッドの安全性の欠如に起因する予測不可能なスイング動作です。ドキュメントによると、 "Swingコンポーネントを作成または相互作用するすべてのコードはイベントディスパッチスレッド上で実行する必要があります"。あなたはそのようなあなたのGUIの作成を書き換える必要があることを達成するために:

public class Real_Main { 
    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 

    private static void createAndShowGUI() { 
    JFrame jf = new JFrame(); 
    Real_Create panel = new Real_Create(); 
    jf.setSize(500, 500); 
    jf.setVisible(true); 
    jf.setResizable(false); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.add(panel); 
    } 
} 

あなたは対象hereの詳細を読むことができます。

関連する問題