2017-01-05 4 views
0

私は正方形を動かすJavaでプログラムを作成しています。しかし、正方形は動かない。私はたくさんのことを試みましたが、どれも働いていません。それは再塗装に問題があるようです。どうすればこの問題を解決できますか?Java正方形が動いていない

package movingSquare; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class MovingSquare extends JComponent { 
    private static final long serialVersionUID = -3778627464016140311L; 
    public static JFrame f = new JFrame("Moving Square"); 
    public static int x; 
    public static int y; 
    public static Rectangle r = new Rectangle(x, y, 20, 20); 
    public static MovingSquare mv = new MovingSquare(); 
    public static KeyListener kl = new KeyListener() { 
     @Override 
     public void keyPressed(KeyEvent arg0) { 
      // TODO Auto-generated method stub 
      if(arg0.getKeyCode() == KeyEvent.VK_UP) { 
       y += 1; 
       r.setLocation(x, y); 
       mv.repaint(r); 
      } 
      if(arg0.getKeyCode() == KeyEvent.VK_DOWN) { 
       y -= 1; 
       r.setLocation(x, y); 
       mv.repaint(); 
      } 
      if(arg0.getKeyCode() == KeyEvent.VK_LEFT) { 
       x -= 1; 
       r.setLocation(x, y); 
       mv.repaint(); 
      } 
      if(arg0.getKeyCode() == KeyEvent.VK_RIGHT) { 
       x += 1; 
       r.setLocation(x, y); 
       mv.repaint(); 
      } 
     } 
     @Override 
     public void keyReleased(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

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

     }}; 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     f.setBackground(Color.BLUE); 
     f.setMinimumSize(new Dimension(720, 720)); 
     f.setResizable(false); 
     f.setFocusable(true); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.addKeyListener(kl); 
     f.add(new MovingSquare()); 
     f.pack(); 
     f.setVisible(true); 
     boolean e = true; 
     while(e) { 
      System.out.println("x: " + x + " y: " + y); 
     } 
    } 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g1 = (Graphics2D) g; 
     g1.setColor(Color.BLUE); 
     g1.fillRect(0, 0, 720, 720); 
     g1.setColor(Color.RED); 
     g1.fill(r); 
    } 
} 
+0

キーリスナーではなく、キーバインディングを使用する必要があります – ControlAltDel

+0

[キーリスナーの代わりにキーバインディングを使用する方法]の複製が可能です(http://stackoverflow.com/questions/22741215/how-to-use-key-バインディング - キーリスナーの代わりに) – user1803551

答えて

-1

まず、カスタム塗装は、paintComponent()ではなく、paint()をオーバーライドして行います。

すべての静的変数を削除します。カスタムクラスを作成する理由は、クラスのプロパティを含む変数を定義できるためです。

フレーム変数をクラスの一部として使用する必要はありません。コンポーネントは、自身が属するフレームではなく、自分自身について知る必要があります。

f.add(new MovingSquare()); 

まず、MovingSquareコンポーネントを作成してフレームに追加します。

public static MovingSquare mv = new MovingSquare(); 

しかし、別のMovingSquareコンポーネントを作成しますが、フレームを追加することはできません。そのため、ペイントすることはできません。

あなたのクラスはすでにMovingSquareであるため、上記のステートメントを削除してもかまいません。

mv.repaint(); 

上記のとおり、上記の文はコンポーネントがフレームに追加されないため何もしません。

代わりに、コードは次のようになります。あなたは自分自身を再描画するコンポーネントを起こすために必要なすべてのです

repaint(); 

KeyListenerを使用する場合、KeyListenerはフレームではなくコンポーネント自体に追加する必要があります。コンポーネントは、独自の状態を管理する必要があります。

基本的にデザインが間違っていて、修正する必要があります。

ただし、フォーカスのあるコンポーネントのみがイベントを受け取るため、問題が解決しない場合もあります。また、コメントに示唆されているように、Key Bindingsを使用する必要があります。

KeyEventsとKey Bindingsの違いを実証するために、動作例についてはMotion Using the Keyboardをチェックしてください。

関連する問題