2014-01-30 1 views
0

Я сейчас работаю над игрой и делаю все хорошо, но сейчас у меня проблемы. У меня есть JFrame. Я добавил JPanel. JPanel состоит из трех JComponents, которые должны рисовать изображения. Вот мой код: (Обратите внимание, что не все из моих методов показаны)Почему мой JComponent не рисует изображения?

public class Game extends JFrame implements KeyListener { 

public static Game g; 

public JPanel pan; 

Paddle p1; 
Paddle p2; 
Ball ball; 

public int p1Y = 0; 
public int p2Y = 0; 

public int ballY = 300; 

public Game() { 
    setTitle("Game"); 
    setSize(600, 600); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setResizable(false); 

    pan = new JPanel(); 
    pan.setBackground(Color.BLACK); 
    p1 = new Paddle(0, p1Y); 
    p2 = new Paddle(600, p2Y); 
    ball = new Ball(300, ballY); 
    pan.add(p1); 
    pan.add(p2); 

    add(pan); 
    setVisible(true); 

    pan.addKeyListener(this); 
    pan.requestFocus(); 
} 

public static void main(String args[]) { 
    g = new Game(); 
} 

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

class Paddle extends JComponent { 

public Image img = new ImageIcon("resources/paddle.png").getImage(); 

public int x; 
public int y; 

public Paddle(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(img, x, y, this); 
} 
} 




class Ball extends JComponent { 

public Image img = new ImageIcon("resources/ball.png").getImage(); 

public int x; 
public int y; 

public Ball(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(img, x, y, this); 
} 
} 

Я сделал это печать всякий раз, когда был вызван paintComponent, и он напечатал. Единственное, что он не будет рисовать на панели. Мое единственное предположение: конструктор останавливает его от рисования.

+0

Время отладки. Вы ищете подходящее место для изображения? Ты уверен? Вы распечатали user.dir, чтобы проверить? Вы проверили, является ли оно нулевым? Кроме того, часто лучше получить изображение как ресурс, а не как файл, как вы делаете. –

+0

Они не равны нулю, и путь правильный. Мне удалось нарисовать изображение. Другие изображения не будут рисоваться. – user3183865

+0

Хорошо, это полезная информация для нас. Усилия, прилагаемые к отладке, - это хорошо проведенные усилия. Я часто помещал временные границы вокруг своих JPanels, чтобы увидеть, какие размеры они на самом деле, использовать println и отладчик для этой цели. –

ответ

3

Есть несколько основных проблем ...

  1. JPanel по умолчанию использует FlowLayout
  2. FlowLayout использует предпочтительный размер компонента, чтобы определить, как макет компонентов является управление
  3. Ваши компоненты не переопределяют getPreferredSize, что означает, что они вернутся 0x0
  4. A JPanel по умолчанию не фокусируется, поэтому добавление KeyListener к нему и запрос фокуса сделают очень мало. Вы должны рассмотреть возможность использования Key Bindings вместо
  5. JLabel обеспечивает поддержку для рисования Icon. Вы можете обернуть Image в ImageIcon оных использовать это с JLabel рисовать изображения более просто
  6. ImageIcon("resources/ball.png") наводит на мысль о том, что изображения в вопросе сохраняются в виде файлов на диске, но путь предполагает, что они могут быть встроены ресурсы. ImageIcon(String) ожидает, что ссылка будет файл на диске, который был бы относительно контекста выполнения программы

В зависимости от того, что вы хотите достичь, вы можете рассмотреть вопрос о написании собственного менеджера компоновки, который вы можете использовать для управления расположением дочерних компонентов или написать одну «игровую поверхность», которую вы используете для рисования, для рисования состояния игры.

+0

Wow благодарит за подсказку и указатели на ненужный код. Благодаря! – user3183865