2010-06-09 4 views
2

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

} 

} 

Любые предложения о том, как получить это, чтобы добавить к JPanel? Кроме того, это хороший способ, чтобы картинка плавала вокруг экрана случайно для игры?

+1

Переформатированный код; пожалуйста, верните, если это неверно. – trashgod

ответ

2

Прежде всего, для этого не нужно расширять JLabel.

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

label.setSize(label.getPreferredSize()); 

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

label.setLocation(...); 

с), если вы хотите, чтобы увеличить место вы бы использовать что-то вроде:.

label.setLocation (label.getLocation() х + 5, ...);

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

panel.setPreferredSize() 

При добавлении панели в панель содержимого вашего фрейма.

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

+0

Это делает его намного проще. Спасибо за помощь – jjpotter

1

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

2

Да, вы должны установить менеджер компоновки для вашего JPanel (GamePanel) в нуль, что говорит системе:

Не ставьте его для меня, я буду делать это вручную

Я думаю, что было бы яснее, если бы я дал вам демонстрационную версию.

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

running demo http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png