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