Я хочу, чтобы mouseclick начинал цикл, который сообщает местоположение мыши и до щелчка мыши. У меня не возникло проблем с запуском цикла и сообщением о местоположении, но даже при том, что метод MouseClicked завершает цикл, если мышь дважды нажата или должна, программа продолжает цикл бесконечно.
public JFramethingy() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.addMouseListener(new MouseAdapter() {
int numClicked;
public void mouseClicked(MouseEvent arg0) {
numClicked++;
for (int i = 0; i > -1;) {
if(i % 1002000 == 0){
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX();
int y = (int) b.getY();
System.out.println(x + "," + y);
}
if (numClicked > 1){
numClicked = 0;
i = -3;
}
i++;
}
}
});
Ваш бесконечный цикл происходит на EDT (это то, что вызывает слушателей), что означает, что Swing не может обработать больше событий. Это означает, что mouseClicked снова не будет вызван, поэтому numClicked не увеличивается.
Вам нужно открутить бесконечный цикл в отдельном потоке, а EDT - только увеличивать numClicked. Затем вам нужно сделать numClicked volatile или, еще лучше, AtomicInteger.
Нет, нет необходимости создавать фоновый поток напрямую, так как вы можете легко решить эту проблему с помощью таймера Swing или javax.swing.Timer, поскольку это только та ситуация, для которой он был создан.