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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top