2015-06-25 4 views
1

Я использую класс this от Sedgewick и Wayne, и мне нужно получить координаты с помощью мыши, когда он нажат в стандартном окне рисования. Этот класс имеет метод boolean mousePressed, который идентифицирует, когда мышь нажата, и мы можем получить координаты из точки, когда мышь нажата в этой точке. Я попытался изменить код Java, чтобы сделать что-то подобное для щелчка мыши:Получить координаты одного щелчка мыши

public static boolean mouseClicked() { 
    synchronized (mouseLock) { 
     return mouseClicked; 
    } 
} 

. . .

public void mouseClicked(MouseEvent e) { 
    synchronized (mouseLock) { 
     mouseX = StdDraw.userX(e.getX()); 
     mouseY = StdDraw.userY(e.getY()); 
     mouseClicked = true; 
    } 
} 

...

public void mouseReleased(MouseEvent e) { 
    synchronized (mouseLock) { 
     mousePressed = false; 
     mouseClicked = false; 
    } 
} 

Если я запускаю следующую программу

public class test { 

public static void main(String[] args) { 
    while(true){ 
     if (StdDraw.mouseClicked()) { 
      System.out.println("hello"); 
     } 
    } 
} 

}

Он держит печать привет (так это означает, что mouseClicked возвращается правда. Как я могу заставить его остановиться? Я попытался установить mouseClicked = false на выпущенное событие, но не работал. Что я делаю wron г? Во-первых, я попытался использовать mousePressed, чтобы понять суть, но я не мог использовать его, чтобы получить две точки.

Спасибо!

+0

Сделать MouseClicked летучего – MadProgrammer

+0

@MadProgrammer Я не понимаю, как это может помочь. – Giiovanna

+0

У вас есть потенциальное состояние гонки нити, где один поток не считывает фактическое значение, которое меняется другим. См. [Atomic Access] (https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html) для получения более подробной информации – MadProgrammer

ответ

1

Вы должны установить флаг mouseClicked ложного после печати значения

while (true) { 
     if (StdDraw.mouseClicked()) { 
      System.out.println("hello"); 
      StdDraw.mouseClicked=false; 
     } 
    } 
+0

, но как я могу написать код для получения первой точки, а затем второй ? Я пробовал (StdDraw.mousePressed()) {// получить координаты}, а затем добавил еще один цикл, чтобы получить второй, но он всегда получает одну и ту же точку дважды! – Giiovanna

+0

Если бы вы могли добавить пример, в котором вы можете получить две разные точки, я был бы рад. Кстати, я не хочу нарисовать суть, мне нужна его координата в моей основной программе (которая закодирована в другом классе) – Giiovanna

+0

Я обновил код с примером. Я думаю, этого будет достаточно для вашего запроса – Madhan