Почему мои объекты не отображаются в JPanel / Java

#java #swing #jframe #jpanel

#java #swing #jframe #jpanel

Вопрос:

Я пытаюсь отобразить 2 объекта Tank на JPanel, tank получает изображение с помощью ImageIcon. JPanel появляется, но мои Танки этого не делают. Я не могу найти, где я ошибаюсь. Мой друг прислал мне код, который он может отображать танки, но я не могу отобразить его на своем компьютере.

Мой класс Tank для получения изображения

 public class Player extends Tank {
private Image img;

public Player(int x, int y){
    super(x, y);
    ImageIcon ii = new ImageIcon("src/TankD.gif");
    img = ii.getImage();
}

public Image getImg() {
    return img;
}
public String toString() {
    return "This is player tank";
}
 

}

Мой класс для рисования изображения

 public class DrawTanks extends JPanel{  // DRAW IMAGE

private ArrayList<Tank> list = new ArrayList<>();
private Tank a;
public DrawTanks() {
    Tank t1 = new Player(100, 200);
    Tank t2 = new Bot(200, 100);
    a = t1;
    list.add(t1);
    list.add(t2);
    setPreferredSize(new Dimension(100,200));
    setLocation(new Point(200, 200));

}

@Override
public void paintComponent(Graphics g){
    for (Tank i: list)
        g.drawImage(i.getImg(), i.getX(), i.getY(), null);
}
 

Мой основной класс

 public class Window extends JFrame{
public static void main(String[]args){
    Window win = new Window();
}
public Window(){
    JPanel pan = new JPanel();
    DrawTanks tanks = new DrawTanks();
    this.add(tanks);
    this.setTitle("Tank");
    this.setSize(900,900);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
}
 

}

Ответ №1:

 JPanel pan = new JPanel();
DrawTanks tanks = new DrawTanks();
this.add(tanks);
 

Почему вы создаете объект «pan»?

По умолчанию JPanel использует потоковое описание, которое учитывает размер панелей.

В вашем классе DrawTanks вы используете:

 setPreferredSize(new Dimension(100,200));
 

чтобы случайным образом установить размер панели.

Но затем вы создаете резервуары:

 Tank t1 = new Player(100, 200);
Tank t2 = new Bot(200, 100);
 

где расположение каждого резервуара находится за пределами предпочтительного размера панели. Таким образом, резервуары, вероятно, окрашены, но они находятся за пределами панели, поэтому вы их не видите.

Решение:

  1. избавьтесь от панели «панорамирование» и просто добавьте панель DrawTanks непосредственно в фрейм
  2. дайте вашим чертежам разумный предпочтительный размер, чтобы все добавленные в него компоненты можно было нарисовать.