2012-04-22 36 views
4

私はJFrameのグリッドレイアウトに赤いブロックを配置する必要があるという私の割り当てに取り組んでいます。その後、ユーザーは矢印キーで赤いブロックの位置を変更できるはずです。getContentPane()。addが機能していませんか?

これまでのところ、赤いブロックをグリッドレイアウトに追加できました。問題は私がそれを動かすことができないということです。

ここに私のMain.javaがあります。以下のPanel.javaのJFrameを呼び出す:

import java.awt.GridLayout; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 


public class Main { 

public static void main(String[] args) { 

    Panel p = new Panel(); 

    p.setSize(870, 780); 
    p.setVisible(true); 
    p.setResizable(true); 
    p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

}//END main 

}//END Main 

Panel.java。赤いブロックを移動するKeyListenerを持つコードを次に示します。しかし、それは動作していません。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


public class Panel extends JFrame implements Runnable{ 

static final int GWIDTH = 200, 
        GHEIGHT = 200; 

static final Dimension gameDim = new Dimension(GWIDTH, GHEIGHT); 


Icon bg = new ImageIcon(getClass().getResource("empty.jpg")); 
Icon red = new ImageIcon(getClass().getResource("actor.jpg")); 
Icon blue = new ImageIcon(getClass().getResource("blue.jpg")); 

JLabel[] labels = new JLabel[48]; 

private int redPoint; 

//Player navigation 
private int i, j; 



public Panel() { 

    i = 1; 
    j = 1; 

    setPreferredSize(gameDim); 
    setFocusable(true); 
    requestFocus(); 
    setTitle("LabWork 10"); 
    setLayout(new GridLayout(6, 8, 10, 10)); 

    redPoint = (i*8)+j; 


    for(int i=0 ; i<48 ; i++) 
     labels[i] = new JLabel(bg); 


    labels[redPoint] = new JLabel(red); 


    for(int i=0 ; i<48 ; i++) 
     getContentPane().add(labels[i]); 


    addKeyListener(new KeyListener() { 

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

     } 

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

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 

      if(e.getKeyCode() == KeyEvent.VK_LEFT) { 
       j--; 
       labels[redPoint] = new JLabel(bg); 
       getContentPane().add(labels[redPoint]); 
       redPoint = (i*8)+j; 
       labels[redPoint] = new JLabel(red); 
       getContentPane().add(labels[redPoint]); 
      } 

      if(e.getKeyCode() == KeyEvent.VK_RIGHT) { 
       j++; 
       labels[redPoint] = new JLabel(bg); 
       getContentPane().add(labels[redPoint]); 
       redPoint = (i*8)+j; 
       labels[redPoint] = new JLabel(red); 
       getContentPane().add(labels[redPoint]); 
      } 

      if(e.getKeyCode() == KeyEvent.VK_UP){ 
       i--; 
       labels[redPoint] = new JLabel(bg); 
       getContentPane().add(labels[redPoint]); 
       redPoint = (i*8)+j; 
       labels[redPoint] = new JLabel(red); 
       getContentPane().add(labels[redPoint]); 
      } 

      if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
       i++; 
       labels[redPoint] = new JLabel(bg); 
       getContentPane().add(labels[redPoint]); 
       redPoint = (i*8)+j; 
       labels[redPoint] = new JLabel(red); 
       getContentPane().add(labels[redPoint]); 
      } 

     }//end keyPressed 

    });//end addKeyListener 

}//END panel 







@Override 
public void run() { 



} 

} 

KeyListenerのコードが赤いブロックの位置を変更できない理由は何ですか?

編集1:ここでは

は、作業移動のタイルとのコードです。また、外出を防ぐことで。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


public class Panel extends JFrame implements Runnable{ 

static final int GWIDTH = 200, 
        GHEIGHT = 200; 

static final Dimension gameDim = new Dimension(GWIDTH, GHEIGHT); 


Icon bg = new ImageIcon(getClass().getResource("empty.jpg")); 
Icon red = new ImageIcon(getClass().getResource("actor.jpg")); 
Icon blue = new ImageIcon(getClass().getResource("blue.jpg")); 

JLabel[] labels = new JLabel[48]; 

private int redPoint; 

//Player navigation 
private int i, j; 



public Panel() { 

    i = 1; 
    j = 1; 

    setSize(870, 780); 
    setVisible(true); 
    setResizable(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setPreferredSize(gameDim); 
    setFocusable(true); 
    requestFocus(); 
    setTitle("LabWork 10"); 
    setLayout(new GridLayout(6, 8, 10, 10)); 
    setFocusable(true); 
    requestFocusInWindow(); 

    redPoint = (i*8)+j; 


    for(int i=0 ; i<48 ; i++) 
     labels[i] = new JLabel(bg); 


    labels[redPoint] = new JLabel(red); 


    for(int i=0 ; i<48 ; i++) 
     getContentPane().add(labels[i]); 


    addKeyListener(new KeyListener() { 

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

     } 

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

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 

      if (e.getKeyCode() == KeyEvent.VK_LEFT) 
       j--; 

      if (e.getKeyCode() == KeyEvent.VK_RIGHT) 
       j++; 

      if (e.getKeyCode() == KeyEvent.VK_UP) 
       i--; 

      if (e.getKeyCode() == KeyEvent.VK_DOWN) 
       i++; 

      run(); 

      //for preventing going out of bounds 
      int oldRedPoint = redPoint; 
      int old_i = i; 
      int old_j = j; 

      redPoint = (i * 8) + j; 

      if(redPoint > 47 || redPoint < 0) { 
       redPoint = oldRedPoint; 
       i = old_i; 
       j = old_j; 
      } 

      labels[oldRedPoint].setIcon(bg); 
      labels[redPoint].setIcon(red); 
     } 

    });//end addKeyListener 

}//END panel 



@Override 
public void run() { 

    try { 

    } catch (Exception e) { 
     // TODO: handle exception 
    } 

} 

} 
+1

、そうPane'が取得する'コンテンツに追加され、以前の1:私は仕事にあなたのコードのために私自身のイメージを作成する必要がありました破棄され、そして神は何が起こっているのか、 'new JLabel()'の初期化が多すぎることを知って、既に 'Grid'に新しい' JLabel'を追加するのではなく 'JLabel'のバックグラウンドを変更するだけです。 –

+1

'Panel extends JFrame'そのようなコードを書くことができるとき、誰が難読化器を必要としますか? ;) –

答えて

5

KeyListenerはフォーカスのあるコンポーネントに対してのみ機能するため、KeyListenerの問題はおそらく焦点の1つです。 1つの解決策は、setFocusable(...)メソッドを使用してコンポーネントのフォーカスを取得可能にし、レンダリング後にrequestFocusInWindow()を設定することです。

もう1つ、より洗練された解決方法は、KeyListenerの代わりにKey Bindingsを使用し、JComponent.WHEN_IN_FOCUSED_WINDOWのものである適切なInputMapにバインドすることです。そうすれば、焦点の問題についてあまり心配する必要はありません。

このサイトでキーバインディングを使用する方法の例がたくさんあります。あなたが検索することができますが、私が書いたものもありません。

編集
重要な問題ではありません。修正されています。 ...さらに

編集2
を分析するために、私はあなたの問題は、あなたがそれを行うべきではありませんcontentPaneに新しいのJLabelを追加しようとしているということだと思います。代わりに、既存のJLabelでImageIconをスワップする必要があります.JLabelではなく移動するイメージです。

編集3
これはそれです。物事を単純化する必要があります。例:

 @Override 
    public void keyPressed(KeyEvent e) { 
     int oldRedPoint = redPoint; 
     if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
      j--; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      j++; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_UP) { 
      i--; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
      i++; 
     } 
     redPoint = (i * 8) + j; 
     labels[oldRedPoint].setIcon(bg); 
     labels[redPoint].setIcon(red); 
    } 

私は記録のためにキーバインディングをキーリスナーよりも好むと述べなければなりません。

編集4
また、あなたはより良い0下またはlabels.length上に行くからあなたのレッドポイントを防ぐためにコードを入れたいです。

また、同様の質問をする場合は、適切なコードを投稿していただきありがとうございますが、画像などの外部リソースに依存しないコードを投稿してください。あなたは何度も何度もあなたの `JLabel`を初期化し、あなたはすべて間違っているように思える

private Icon createIcon(Color color) { 
    BufferedImage img = new BufferedImage(IMG_W, IMG_H, 
     BufferedImage.TYPE_INT_ARGB); 
    Graphics g = img.getGraphics(); 
    g.setColor(color); 
    g.fillRect(0, 0, IMG_W, IMG_H); 
    g.dispose(); 
    return new ImageIcon(img); 
} 
+1

@キーイベントが正しく取得できるかどうかを確認できます。実行されるかどうかを知る必要がある各コードの先頭に単純なSystem.out.println()を入れてください。 –

+0

ありがとう、それを感謝します。 :)私は前にそれを試して、それは動作します。問題はおそらく焦点を合わせることです。 –

+0

@ Can:いいえ、それは焦点の問題ではありません。私は訂正した。 –

関連する問題