2

JLabel を拡張して、ゲームの JPanel 内を移動するオブジェクトとして使用するクラスを作成しました。

import javax.swing.*;

public class Head extends JLabel {

 int xpos;
 int ypos;

 int xvel;
 int yvel;

 ImageIcon chickie = new ImageIcon(
        "C:\\Users\\jjpotter.MSDOM1\\Pictures\\clavalle.jpg");
 JLabel myLabel = new JLabel(chickie);

 public Head(int xpos, int ypos, int xvel, int yvel){

  this.xpos = xpos;
  this.ypos = ypos;
  this.xvel = xvel;
  this.yvel = yvel;
 }

 public void draw(){
  myLabel.setLocation(xpos, ypos);
 }

 public double getXpos() {
  return xpos;
 }

 public double getYpos() {
  return ypos;
 }

 public int getXvel() {
  return xvel;
 }

 public int getYvel() {
  return yvel;
 }

 public void setPos(int x, int y){

  xpos = x;
  ypos = y;

 }

}

次に、それを JPanel に追加しようとしています。ここから、x 座標と y 座標をランダムにインクリメントして、画面上に浮かせます。JPanel に自分自身を描画することはできません。異なるパネルにコンポーネントをペイントするという、ここで欠けている重要な概念があることはわかっています。これが私のGamePanelクラスにあるものです

import java.awt.Dimension;
import java.util.Random;
import javax.swing.*;


public class GamePanel extends JPanel {

 Random myRand = new Random();
 Head head = new Head(20,20,0,0);

 public GamePanel(){

  this.setSize(new Dimension(640, 480));
  this.add(head);

 }

}

これを JPanel に追加する方法について何か提案はありますか? また、これはゲームの画面の周りにランダムに画像を浮かせる良い方法ですか?

4

3 に答える 3

2

まず第一に、これを行うために JLabel を拡張する必要はありません。

a) 以下を使用して画像をラベルに追加した後、ラベルのサイズを設定します。

label.setSize( label.getPreferredSize() );

b) draw() とすべてのセッター メソッドは必要ありません。ラベルを移動するには、次を使用します。

label.setLocation(...);

c)場所を増やしたい場合は、次のようなものを使用します:

label.setLocation( label.getLocation().x + 5, ...);

ラベルのサイズと位置を設定したら、パネルに直接追加できます。次のことを確認してください。

panel.setPreferredSize() 

フレームのコンテンツ ペインにパネルを追加するとき。

あなたのコードは漠然としていて、具体的な提案をすることができません。さらにヘルプが必要な場合は、SSCCEを投稿してください。問題は、レイアウト マネージャーの使用、またはレイアウト マネージャーを使用していないという事実である可能性があります。

于 2010-06-09T15:09:06.460 に答える
2

はい、JPanel ( GamePanel ) のレイアウト マネージャーを null に設定して、システムに次のように通知する必要があります。

配置しないでください。手動で配置します

編集

実行中のデモを提供すると、より明確になると思います。

この例を参照してください。camickr が指摘するように、コンポーネントをサブクラス化する必要はありません。

import javax.swing.*;
import java.util.Timer;
import java.util.*;

class FloatingDemo {
    public static void main( String [] args ){
        // create the panel         
        JPanel panel = new JPanel();
        panel.setLayout(null);

        // create the label with an image
        final JLabel label = new JLabel(new ImageIcon("StackOverflowLogo.png"));
        label.setSize(label.getIcon().getIconWidth(), 
                      label.getIcon().getIconHeight());
        panel.add( label );

        // create the frame containing both 
        JFrame frame = new JFrame();
        frame.add( panel );
        frame.setSize(800, 600 );
        frame.setVisible( true );

        // move it randomly every second  
        Timer timer = new Timer();
        final Random random = new Random();
        timer.schedule( new TimerTask() {
           public void run(){
                 label.setLocation( random.nextInt(800-label.getWidth()), 
                                    random.nextInt(600-label.getHeight()));       
           } 
        }, 0, 1000 );

    }
}

ところで、レイアウト マネージャーを null に設定しなくても機能しますが、ウィンドウのサイズを変更すると、jpanel が自動的に場所を設定します。

実行中のデモ http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png

于 2010-06-09T15:11:05.770 に答える
1

私が信じている主な問題は、コンストラクターに実際に画像を追加していないことですHead

あなたがする必要があるのは、ImageIconあなたがやっているように新しいものを作成することです.

public Head(int xpos, int ypos, int xvel, int yvel){
    // calls the JLabel constructor to create a label with an image
    super(new ImageIcon("C:\\Users\\jjpotter.MSDOM1\\Pictures\\clavalle.jpg"))
    this.xpos = xpos;
    this.ypos = ypos;
    this.xvel = xvel;
    this.yvel = yvel;
}

これHeadにより、指定したイメージで作成されます。

コンストラクターの問題を整理したら、オブジェクトを追加しHeadたオブジェクトからsetLocation() を呼び出すことができます。JPanelこのようにランダムに動かすことができます。

また、 をJPanel追加するHeadでは、 を null に設定する必要がありLayoutManaerます。これにより、手動でコンポーネントをパネルに配置できます。

于 2010-06-09T15:08:13.973 に答える