Problema Pintura de Jlabel Class para outra classe JPanel
Pergunta
Eu criei uma classe que estende Jlabel para usar como meu objeto que se move em torno de um JPanel para um jogo.
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;
}
}
Estou tentando adicioná -lo ao meu jpanel. A partir daqui, incrementarei aleatoriamente suas coordenadas x e y para flutuar pela tela. Não posso fazer com que ele se pinta no jpanel. Eu sei que existe um conceito -chave que estou perdendo aqui que envolve pintar componentes em diferentes painéis. Aqui está o que tenho na minha aula de 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);
}
}
Alguma sugestão sobre como fazer isso adicionar ao JPanel? Além disso, é uma boa maneira de fazer a imagem flutuar na tela aleatoriamente para um jogo?
Solução
Primeiro de tudo, não há necessidade de estender um jlabel para fazer isso.
a) Você define o tamanho da etiqueta depois de adicionar a imagem ao rótulo usando:
label.setSize( label.getPreferredSize() );
b) Você não precisa do draw () e de todos os métodos do setter. Para mover o rótulo, tudo o que você faz é usar:
label.setLocation(...);
c) Se você deseja incrementar o local, usaria algo como:
LABEL.setLocation (Label.getLocation (). X + 5, ...);
Depois de definir o tamanho e o local do rótulo, você pode adicioná -lo diretamente ao painel. Certifique -se de ter feito:
panel.setPreferredSize()
Quando você adiciona seu painel ao painel de conteúdo do seu quadro.
Seu código é vago demais para dar sugestões específicas. Se você precisar de mais ajuda postar seu Sscce. Seu problema pode ser o uso do gerente de layout ou o fato de você não estar usando gerentes de layout.
Outras dicas
Sim, você deve definir o gerente de layout para o seu JPanel (gamepanel) como NULL que diga ao sistema:
Não coloque isso para mim, eu farei isso manualmente
editar
Eu acho que ficaria mais claro se eu lhe der uma demonstração em execução.
Veja este exemplo. Como pontos de Camickr, você não precisa subclasse os componentes.
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 );
}
}
BTW, não configurando o gerenciador de layout como NULL também funciona, mas se você redimensionar a janela, o JPanel definirá automaticamente o local para você.
Demonstração em execução http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png
O principal problema que acredito é que você realmente não adiciona a imagem a Head
no seu construtor.
O que você precisa fazer é criar um novo ImageIcon
Como você está fazendo, e em seu construtor faz algo mentir isso;
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;
}
Isso criará o seu Head
com a imagem especificada.
Depois de resolver o problema do construtor, você pode ligar para setLocation () em você Head
objeto do JPanel
você adicionou isso a. É assim que você pode movê -lo aleatoriamente.
Além disso, no JPanel
Você está adicionando o Head
para, você precisa garantir que você defina o LayoutManaer
Para nulo, para que você possa colocar manualmente o componente no painel.