слушатель мыши на кадре - PullRequest
0 голосов
/ 03 июня 2011

Привет я пытаюсь добавить слушателя мыши в свой кадр, чтобы щелкнуть мышью и проверить, находится ли она внутри круга, проблема в том, что она не вызывает

public class CircleDraw extends Frame implements MouseListener {

static int circles = 0;
private double color;
double mousex = 0;
double mousey = 0;
int score;

public void mouseClicked(MouseEvent evt)
{
         mousex = evt.getX();
         mousey = evt.getY();
}
public void mouseEntered (MouseEvent me) {}
public void mousePressed (MouseEvent me) {}
public void mouseReleased (MouseEvent me) {}
public void mouseExited (MouseEvent me) {}

public void paint(Graphics g) {
    try {
                this.addMouseListener(this);
      while (circles < 20) {
        color = 10*Math.random();
        Shape circle = new Ellipse2D.Double(900*Math.random(),900*Math.random(), 50.0f,      50.0f);
        Graphics2D ga = (Graphics2D)g;
        ga.draw(circle);
        if(color >2)
            ga.setPaint(Color.green);
        else
            ga.setPaint(Color.BLACK);

        ga.fill(circle);

        if(circle.contains(mousex, mousey) && color > 2)
                score ++;
        else
            if(circle.contains(mousex, mousey) && color < 2)
                score--;
        Thread.sleep(1000);

        System.out.println(circles);
        System.out.println(mousex);
        System.out.println(mousey);

        circles ++;
        ga.setPaint(Color.white);
        ga.fill(circle);
    }
                System.exit(0);
 } catch (InterruptedException e) {
    e.printStackTrace();
 } 
  }

  public static void main(String args[]) {

  Frame frame = new CircleDraw();

 frame.addWindowListener(new WindowAdapter(){
  public void windowClosing(WindowEvent we){
 System.exit(0);
 }
 });
 frame.setSize(1000, 1000);
 frame.setVisible(true);

 }}

Ответы [ 3 ]

2 голосов
/ 03 июня 2011

Смертельно добавлять свой mouselistener в метод paint (), так как этот метод вызывается очень очень часто (с каждым перекрашиванием), и добавляется так много слушателей (с каждым перекрашиванием).

Вы должны добавить слушателя к вашей панели контента, а не к самому JFrame. Это сделает это. Вы можете сделать это в конструкторе вашего класса:

public CircleDraw() {
    this.getContentPane().addMouseListener(this);
}

Я думаю, это не решит вашу проблему полностью, поскольку вы не нажмете мышку, пока активен метод рисования. Ваш дизайн кода (особенно ваш цикл while) не дает времени на запуск других событий. Таким образом, событие mouseclick будет обрабатываться после 20 ваших циклов. Вы можете проверить это, добавив

public void mouseClicked(MouseEvent evt) {
    mousex = evt.getX();
    mousey = evt.getY();
    System.out.println("X: "+mousex+"/ Y: "+mousey);
}

к вашему коду. Вы должны запустить свой графический интерфейс в другом потоке (например, использовать SwingUtilities и Runnable () для этого). Я рекомендую вам получить хорошую книгу о разработке JAVA. Или вы можете начать с онлайн-уроков, таких как этот .

ИМХО, вы не должны пытаться иметь дело с awt, вместо этого используйте SWING или SWT для GUI-дизайна, так как это намного удобнее.

0 голосов
/ 03 июня 2011

Вот некоторые проблемы, которые я вижу с этим источником:

  1. Добавляет слушателя в paint()
  2. Вызовы wait() в методе paint().
  3. Вызывает System.exit() в методе paint() (не совсем проблема, но очень необычно).
  4. Плохо отформатирован и труден для понимания
  5. Вызывает устаревшие методы.
  6. Коды в AWT в неправильном тысячелетии.
0 голосов
/ 03 июня 2011

добавить слушателя в конструктор, краска вызывается повторно

...