我正在尝试在 javafx 中创建一个表,允许用户单击一行以转到一页或双击该行以转到另一页。问题在于应用程序注册了单击事件,但没有等待查看是否有另一个双击。有没有办法让程序等待,看看是否有另一次点击?
到目前为止我所拥有的看起来类似于
TableView searchResults;
ObservableList<MovieRow> rows = FXCollections.observableArrayList();
private TableColumn<MovieRow, String> title;
title.setCellValueFactory(new PropertyValueFactory<>("mTitle"));
rows.add(new MovieRow("The cat in the hat"));
searchResults.setItems(rows);
searchResults.setRowFactory(tv -> {
TableRow<MovieRow> row = new TableRow<>();
row.setOnMouseClicked(event -> {
MovieRow tempResult = row.getItem();
if (event.getClickCount() == 1) {
System.out.println(tempResult.getMTitle + " was clicked once");
}else{
System.out.println(tempResult.getMTitle + " was clicked twice");
}
});
return row;
});
public class MovieRow{
private String mTitle;
public MovieRow(String title){
mTitle = title;
}
public String getMTitle() {
return mTitle;
}
}
实际产量
single click: The cat in the hat was clicked once
double click: The cat in the hat was clicked once
期望的输出
single click: The cat in the hat was clicked once
double click: The cat in the hat was clicked twice
我只找到了自行处理双击或自行单击的结果,但没有同时处理两者,所以我不确定这是否可能。任何帮助将非常感激。谢谢。
作为 API 的一部分,您无法做到这一点:您只需自己编写代码“让程序等待,看看是否有另一次点击”。请注意,这意味着单击操作在执行之前必须稍微暂停;没有办法解决这个问题(你的程序无法知道将来会发生什么)。您可以考虑采用不同的方法(例如左按钮与右按钮)来避免这种稍微不方便的用户体验。
但是,解决方案可能如下所示:
public class DoubleClickHandler {
private final PauseTransition delay ;
private final Runnable onSingleClick ;
private final Runnable onDoubleClick ;
private boolean alreadyClickedOnce ;
public DoubleClickHandler(
Duration maxTimeBetweenClicks,
Runnable onSingleClick,
Runnable onDoubleClick) {
alreadyClickedOnce = false ;
this.onSingleClick = onSingleClick ;
this.onDoubleClick = onDoubleClick ;
delay = new PauseTransition(maxTimeBetweenClicks);
delay.setOnFinished(e -> {
alreadyClickedOnce = false ;
onSingleClick.run()
});
}
public void applyToNode(Node node) {
node.setOnMouseClicked(e -> {
delay.stop();
if (alreadyClickedOnce) {
alreadyClickedOnce = false ;
onDoubleClick.run();
} else {
alreadyClickedOnce = true ;
delay.playFromStart();
}
});
}
}
您可以将其与以下产品一起使用:
searchResults.setRowFactory(tv -> {
TableRow<MovieRow> row = new TableRow<>();
DoubleClickHandler handler = new DoubleClickHandler(
Duration.millis(500),
() -> {
MovieRow tempResult = row.getItem();
System.out.println(tempResult.getMTitle + " was clicked once");
},
() -> {
MovieRow tempResult = row.getItem();
System.out.println(tempResult.getMTitle + " was clicked twice");
}
);
handler.applyToNode(row);
return row ;
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)