Проблема картины класса JLABEL к другому классу jpanel

StackOverflow https://stackoverflow.com/questions/3007021

Вопрос

Я создал класс, который расширяет 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. Я знаю, что есть ключевое понятие, которое мне не хватает, что включает в себя роспись компонентов на разных панелях. Вот что у меня в моем геймпанельном классе

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? Кроме того, это хороший способ пойти на то, чтобы картина поплавок по экрану случайным образом для игры?

Это было полезно?

Решение

Прежде всего нет необходимости распространять JLabel, чтобы сделать это.

а) Вы устанавливаете размер метки после добавления изображения на метку с помощью:

label.setSize( label.getPreferredSize() );

b) Вам не нужна ничья (), а все методы сеттера. Чтобы переместить этикетку все, что вы делаете, это использовать:

label.setLocation(...);

c) Если вы хотите увеличить местоположение, которое вы бы использовали что-то вроде:

Label.SetLocation (Label.getLocation (). X + 5, ...);

Как только вы установите размер и местоположение метки, вы можете добавить его прямо на панель. Убедитесь, что вы сделали:

panel.setPreferredSize() 

Когда вы добавляете свою панель на панель контента вашего кадра.

Ваш код слишком расплывчан, чтобы дать конкретные предложения. Если вам нужно больше помочь опубликовать свой Соревнование. Отказ Ваша проблема может быть использование менеджера макета или тот факт, что вы не используете менеджеры макета.

Другие советы

Да, вы должны установить менеджер макета для вашего 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 );

    }
}

BTW, не устанавливая менеджер макета на NULL, но если вы измените размер окна, JPanel автоматически установит вас местоположение для вас.

Запуск DEMO http://img444.imageshack.us/img444/2567/Capturadepantalla201006C.png.

Основная проблема, которую я считаю, что вы на самом деле не добавляете изображение на 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 с указанным изображением.

После того, как вы разберете проблему конструктора, вы можете позвонить в SetLocation () на вас Head объект из JPanel Вы добавили его. Вот как вы можете перемещать его случайным образом.

Также, в JPanel Вы добавляете Head чтобы, вам нужно убедиться, что вы установили LayoutManaer Нуль, чтобы вы могли вручную разместить компонент на панели самостоятельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top