我尝试使用Java中的鼠标事件创建一个基本的点击计数器。我理解每个人都有的教程,但他们的程序是半自动的,它每次点击都会记录一个增量。
public void mouseClicked(MouseEvent e)
{
clicks++;
}
我试图做一个全自动版本,它会不断增加,直到你释放按钮,但释放方法不会将布尔值切换为false并停止循环。有什么建议吗?
public class example{
private boolean fire = false;
public void mousePressed(MouseEvent e)
{
if(e.getButton()== e.BUTTON1){fire = true};
while(fire) {clickCounter++; }
}
}
public void mouseReleased(MouseEvent e){
fire = false;
}
}
答案 0 :(得分:0)
为了清楚,一个"点击"鼠标被按下和释放之间通常发生的事情,以及有更多"点击"在此期间是一个人造建筑。
首先,您需要阅读Concurrency in Swing以便更好地理解"睡眠"并且while-loop
在这种情况下不会工作。您正在阻止事件调度线程,阻止处理任何新事件。
以下示例仅尝试计算鼠标按下和释放事件之间的时间,并将结果应用于人工乘数,以创建"单击"计数
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
并在鼠标释放时停止它,允许它增加值
答案 1 :(得分:0)
您设置fire= true
,然后进入无限while(true)
循环。
要解决此问题,请修改循环内部while循环的布尔语句。
while(fire) {
count++;
if (mouseReleased(eventMouseIsReleased))
fire= false;
} // Check while(fire) but now it is false! Move on!
希望这有帮助!