Domanda

Ho creato una classe che estende JLabel da utilizzare come il mio oggetto in movimento intorno a un JPanel per un gioco.

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;

 }

}

Sto quindi cercando di aggiungere sul mio JPanel. Da qui avrò casualmente si incrementa la sua coordinate xey galleggiare intorno allo schermo. Non riesco a dipingere se stesso sui JPanel. So che c'è un concetto chiave che mi manca qui che coinvolge pittura componenti su diversi pannelli. Ecco quello che ho nella mia classe 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);

 }

}

Qualche suggerimento su come ottenere questo da aggiungere al JPanel? Inoltre, questo è un buon modo per andare di avere il galleggiante immagine sullo schermo in modo casuale per un gioco?

È stato utile?

Soluzione

Prima di tutto non v'è alcuna necessità di estendere una JLabel per fare questo.

a) si imposta la dimensione dell'etichetta dopo aver aggiunto l'immagine per l'etichetta utilizzando:

label.setSize( label.getPreferredSize() );

b) Non è necessario il draw (), e tutti i metodi setter. Per spostare l'etichetta tutto ciò che fai è l'uso:

label.setLocation(...);

c) se si vuole incrementare la posizione si può usare qualcosa come:

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

Una volta impostata la dimensione e la posizione dell'etichetta è possibile aggiungerlo direttamente al pannello. Assicurarsi di aver fatto:

panel.setPreferredSize() 

quando si aggiunge il vostro pannello al riquadro del contenuto della vostra struttura.

Il tuo codice è troppo vago per dare suggerimenti specifici. Se avete bisogno di più Aiuto Inserisci SSCCE . Il tuo problema potrebbe essere l'utilizzo di gestore di layout o il fatto non si utilizza gestori di layout.

Altri suggerimenti

Sì, è necessario impostare il gestore di layout per il JPanel (GamePanel) per nulla che dice al sistema:

Non collocare per me, lo farò manualmente

modifica

penso che sarebbe più chiaro se ti do una demo in esecuzione.

Vedere questo esempio. Come punti camickr, non c'è bisogno di creare una sottoclasse dei componenti.

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 );

    }
}

A proposito, non impostare il gestore di layout per nulla funziona anche, ma se si ridimensiona la finestra, il JPanel avrebbe impostare automaticamente la posizione per voi.

esecuzione demo http://img444.imageshack.us/img444/2567/capturadepantalla201006c .png

Il problema principale che credo è che non si ha realmente aggiungere l'immagine Head nel costruttore.

Quello che dovete fare è creare un nuovo ImageIcon come si sta facendo, e nel costruttore fare qualcosa menzogna questo;

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;
}

Questo creerà il vostro Head con l'immagine specificata.

Una volta a risolvere il problema del costruttore, si può quindi chiamare setLocation () su di voi Head oggetto dalla JPanel è stato aggiunto a. Ecco come è possibile spostarlo in modo casuale.

Inoltre, nel JPanel si sta aggiungendo il Head a, è necessario assicurarsi di impostare il LayoutManaer a nulla, quindi è possibile inserire manualmente il componente sul pannello di te stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top