我正在尝试配置某些操作以响应鼠标点击次数。在我看来,单击和三击被检测并应用。但双击并不真正起作用。 我试着做类似的事情:
if (doubleClick)
else if (tripleClick)
else if (singleClick).
检查的顺序也没有帮助,双击的操作永远不会被触发,因为首先触发单击的操作。关于如何做到这一点的任何想法?
答案 0 :(得分:8)
假设您正在做类似
的事情if (mouseEvent.getClickCount()==1)
等等,那么它可能没有按照你的想法去做。 MouseEvent.getClickCount()
只返回"小"中发生的点击次数。地区和小的"多少时间。 "小"是(故意)没有定义。
所以双击只需两次点击。第一个为getClickCount()
返回1,然后第二个返回2.同样,三次点击是三次点击:第一个返回1,下一个返回2,第三个3.您可以使用一段非常简单的代码对此进行测试:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class ClickCountTest extends Application {
@Override
public void start(Stage primaryStage) {
Pane root = new Pane();
root.setOnMouseClicked(event -> System.out.println(event.getClickCount()));
primaryStage.setScene( new Scene(root, 250, 150) );
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果点击,您将看到输出" 1"。如果你双击,你会看到" 1"然后是" 2"。
如果它是双击(或三击)的一部分,则没有内置的方法可以忽略第一次点击。显然,问题在于,在第一次点击时,没有办法知道在没有某种时机的情况下是否会出现另一次点击,这会非常复杂并且会导致延迟响应任何鼠标点击。
有一段时间有人谈论实现onClickSequenceFinished
类型的事件,因此您可以侦听单击序列完成事件,然后查询该事件以查找该数字,而不是监听鼠标单击事件。点击次数最后,决定不支持这一点,因为用例不被认为是良好的UI编程实践。
原因在于,例如,双击以排除单击操作是一个非常糟糕的主意。如果用户双击太慢,则会无意中调用单击操作(两次)。因此,如果您同时支持双击和单击操作,则应选择操作,以便在调用双击操作时调用单击操作是有意义的。典型示例是ListView
,双击列表元素会打开一个"详细信息"编辑器,单击选择该项目。对于正在编辑的项目也是有意义的,因此双击操作意味着单击操作。
换句话说,如果双击操作被设计为排除单击操作,那么它被认为是一个糟糕的设计,并且不直接支持该习语。您应该考虑使用修饰键而不是点击计数来进行这种区分。
<强>更新强>
如果确实希望通过点击计数区分事件(我 真的 不推荐它),那么您可以使用像PauseTransition
这样的东西来实现计时器。类似的东西:
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class ClickCountTest extends Application {
@Override
public void start(Stage primaryStage) {
// This value may need tuning:
Duration maxTimeBetweenSequentialClicks = Duration.millis(500);
PauseTransition clickTimer = new PauseTransition(maxTimeBetweenSequentialClicks);
final IntegerProperty sequentialClickCount = new SimpleIntegerProperty(0);
clickTimer.setOnFinished(event -> {
int count = sequentialClickCount.get();
if (count == 1) System.out.println("Single click");
if (count == 2) System.out.println("Double click");
if (count == 3) System.out.println("Triple click");
if (count > 3) System.out.println("Multiple click: "+count);
sequentialClickCount.set(0);
});
Pane root = new Pane();
root.setOnMouseClicked(event -> {
sequentialClickCount.set(sequentialClickCount.get()+1);
clickTimer.playFromStart();
});
primaryStage.setScene( new Scene(root, 250, 150) );
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这也可能是Tomas Mikula's ReactFX framework的一个很好的用例,(另请参阅他的blog post)。
答案 1 :(得分:5)
如果要检测每个不同的点击次数,可以使用switch语句。
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
/**
*
* @author jeffreyguenther
*/
public class ListTest extends Application{
@Override
public void start(Stage stage) throws Exception {
Circle c = new Circle();
c.setRadius(100);
c.setCenterX(100);
c.setCenterY(100);
c.setFill(Color.AQUA);
c.setStroke(Color.BLACK);
c.setStrokeWidth(3);
c.setOnMousePressed((e) ->{
switch(e.getClickCount()){
case 1:
System.out.println("One click");
break;
case 2:
System.out.println("Two clicks");
break;
case 3:
System.out.println("Three clicks");
break;
}
});
stage.setScene(new Scene(new Group(c)));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
然后,当您单击,双击和三次单击此输出时:
One click
Two clicks
Three clicks
您可以使用case语句来确定要处理的计数。例如,如果您只想处理双击和三击,则可以删除第一个案例。