2013-12-13 2 views
0

Я пытаюсь сделать игру в понг на Java, но она не работает. Я сделал несколько тестов, и кажется, что переменные обновления, но что, когда я repaint(); в таймерами actionPerformed(ActionEvent e) не вызывает метод paintComponent()repaint() не вызывает paintComponent()

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class PongGame extends JComponent implements ActionListener, MouseMotionListener{ 

    public int state = 1; 
    public int paddleX; 
    public String buttonColor = "blue"; 
    public int mouseX, mouseY; 
    private int ballX = 400; 
    private int ballY = 150; 

    public static void main(String[] args){ 

     JFrame window = new JFrame("Pong"); 
     PongGame game = new PongGame(); 
     window.add(new PongGame()); 
     window.pack(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setLocationRelativeTo(null); 
     window.setResizable(false); 
     window.setVisible(true); 

     Timer t = new Timer(20, game); 
     t.start(); 
    } 

    public Dimension getPreferredSize(){ 
     return new Dimension(800, 600); 
    } 

    public void paintComponent(Graphics g){ 
     paddleX = mouseX; 

     g.setColor(Color.WHITE); 
     g.fillRect(0,0, 800, 600); 

     g.setColor(Color.BLACK); 

     g.fillRect(paddleX, 550, 150, 15); 
     g.fillOval(ballX, ballY, 30, 30); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     ballX = ballX + 10; 
     ballY = ballY + 10; 
     System.out.println(ballX + " " + ballY); 

    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     mouseX = e.getX(); 
     repaint(); 
    } 
} 

ответ

0

перекрасить() не вызывает краску() напрямую , Он назначает вызов промежуточному методу update(). Наконец, update() вызывает paint() (если вы не переопределяете обновление).

Причина такой сложности - поддержка Java для параллельного программирования. Он делает это с помощью потоков.

Использование repaint() может быть сложным по крайней мере по трем причинам.

  1. взаимодействие между перекрашивать() и спонтанной живописи, проделанной GUI потоке
  2. тот факт, что перекрасить() просто просит систему потоков запланировать вызов для обновления()/краска(), а затем завершает работу , Метод repaint() является асинхронным.
  3. проблема предотвращения стирания чертежа при его обновлении.

Предлагаю вам попробовать то же самое с обновлением().

Полезная ссылка: http://www.scs.ryerson.ca/~mes/courses/cps530/programs/threads/Repaint/index.html

+1

Ваш совет полезен для AWT, но не подходит для Swing, где 'update()' не следует вызывать, если он не вызван для обновления Look & Feel. –

+0

Также: [Просмотрите изменения] (http://stackoverflow.com/posts/20573439/revisions), чтобы узнать, как создать «упорядоченный список». Пожалуйста, добавьте письмо в верхнем регистре в начале предложений. Также используйте капитал для слова I, аббревиатуры и аббревиатуры, такие как JEE или WAR. Это облегчает людям понимание и помощь. –

+1

Для получения дополнительной информации см. Статью Oracle [Живопись с Swing и AWT] (http://www.oracle.com/technetwork/java/painting-140037.html), чтобы понять, почему они утверждают '' ... для этого причина update() никогда не вызывается в компонентах Swing ... "'. –

1

Проблема заключается в том:

PongGame game = new PongGame(); 
window.add(new PongGame()); 

У вас есть два экземпляра PongGame. Один добавлен к кадру (new PongGame()), а другой (game), который фактически реагирует на таймер. Измените этот ряд на:

window.add(game); 
1

Для устранения проблемы. Добавьте конструктор (протестировано локально):

PongGame() { 
    addMouseMotionListener(this); 
} 
+0

Но, как отмечают другие, 'PongGame game = new PongGame();' полностью избыточно. –

+0

Я бы хотел, чтобы вы просмотрели мою программу giff перед публичным обменом, о котором я вам говорил. Не могли бы вы дать мне свое мнение? – Sage

+0

* «Я бы хотел, чтобы вы просмотрели мою программу giff». * Если вы после консультации по дизайну OO, я не тот человек, которого вы спросите. Вы имели в виду просто «вообще»? Если это так, вы можете связаться со мной через andrewthommo в gmail. –

4
  • вы не зарегистрированы реализованного MouseMotionListener к любому компоненту:

    game.addMouseMotionListener(game); 
    
  • вы не добавляете свой первый созданный экземпляр PongGame к рамка скорее добавила новую ошибку производства:

    PongGame game = new PongGame(); 
        window.add(new PongGame()); // <<--- why creating the new instance ? 
           // it should be window.add(game); 
    
  • Как хорошая практика программирования: попробуйте помещать код add listener в собственный контекст создания компонента, т. Е. В их конструкторе, чтобы сделать ваш код более читаемым.

Смежные вопросы