Просто чтобы прояснить, "щелчок" - это то, что обычно происходит между нажатием и отпусканием мыши, идея о том, что в этот период происходит больше "щелчков", является искусственной конструкцией.
Во-первых, вынужно прочитать Параллельность в Swing , чтобы лучше понять, пока "сон" и while-loop
не будут работать в этом контексте.Вы блокируете поток диспетчеризации событий, предотвращая обработку любых новых событий.
В следующем примере просто делается попытка рассчитать время между нажатием и отпусканием события мыши и применяет искусственный множитель к результату для создания"click" count
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.time.Duration;
import java.time.LocalDateTime;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
JLabel label = new JLabel("...");
add(label);
addMouseListener(new MouseAdapter() {
private LocalDateTime clickTime;
@Override
public void mouseClicked(MouseEvent e) {
clickTime = LocalDateTime.now();
}
@Override
public void mouseReleased(MouseEvent e) {
if (clickTime == null) {
return;
}
Duration between = Duration.between(clickTime, LocalDateTime.now());
long seconds = between.getSeconds();
long clicks = seconds * 3;
label.setText("Held for " + seconds + "s = " + clicks + " clicks");
clickTime = null;
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
Другое решение может состоять в том, чтобы запустить Swing Timer
при нажатой мыши и остановить его при отпускании мыши, позволяя ему увеличивать значение