2015-03-06 6 views
1

Мне было интересно, если вы могли бы помочь мне определить, что случилось с моим кодом, мне в основном нужно сгенерировать мяч в точке из mouseclick, но по какой-то причине его не работает. Мне удалось получить мяч, заполняемый только по умолчанию. Я тратил межсезонья часами и честно не могу понять, что случилось, любая помощь очень ценится, спасибо заранее.Ошибка при создании объекта в точке mouseclick, не может обнаружить ошибку в коде вообще, любая помощь оценивается

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.util.Random; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class Game extends JPanel implements MouseListener{ 

    int x = 0; 
    int y = 0; 
    int xvel = 1; 
    int yvel =1; 



    //code to generate a random colour for the balls 
    Random rand = new Random(); 
     float r = rand.nextFloat(); 
     float g = rand.nextFloat(); 
     float b = rand.nextFloat(); 
     Color randomColor = new Color(r, g, b); 


    private void moveBall() { 
     if (x + xvel < 0) 
      xvel = 1; 
     if (x + xvel > getWidth() - 30) 
      xvel = -1; 
     if (y + yvel < 0) 
      yvel = 1; 
     if (y + yvel > getHeight() - 30) 
      yvel = -1; 

     x = x + xvel; 
     y = y + yvel; 
    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
     x = this.getX(); 
     y = this.getY(); 
    } 


    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(randomColor); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     g2d.fillOval(x, y, 30, 30); 


    } 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame("BallProject"); 
     Game game = new Game(); 
     frame.add(game); 
     frame.setSize(300, 400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 




     while (true) { 
      game.moveBall(); 
      game.repaint(); 
      Thread.sleep(10); 
     } 
    } 







    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 



    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 



    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 



    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 



} 

ответ

1

Вы никогда не зарегистрировать Game в качестве ответчика на события мыши ...

public Game() { 
    addMouseListener(this); 
} 

См How to Write a Mouse Listener для более подробной информации.

Вы также используя компоненты х/у позиции, а не щелчки мыши ...

x = this.getX(); 
y = this.getY(); 

Вместо этого используйте

x = arg0.getX(); 
y = arg0.getY(); 

Я также, как правило, советую переопределение paint в качестве общего правила и предложите использовать paintComponent вместо

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

  1. Вы не знаете, на что вызван основной объект Thread, вы не должны рисковать запуском бесконечного цикла внутри него. Кроме того, вы должны убедиться, что пользовательский интерфейс создан в контексте потока Dispatching Event. См. Initial Threads для получения более подробной информации.
  2. Вы изменяете состояние переменных x/y вне контекста EDT, но эти значения требуются EDT для рисования результатов, это может привести к условию гонки, которое может вызвать случайные и нежелательные результаты.

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

  • Нет связанных вопросов^_^