Problema pittura classe JLabel ad un'altra classe JPanel
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?
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.