java tableview 双击_java-在TableView JavaFX的行上检测双击
java-在TableView JavaFX的行上檢測雙擊
我需要檢測在TableView行上的雙擊。
如何偵聽該行任何部分的雙擊并獲取該行的所有數據以將其打印到控制臺?
6個解決方案
108 votes
TableView table = new TableView<>();
//...
table.setRowFactory( tv -> {
TableRow row = new TableRow<>();
row.setOnMouseClicked(event -> {
if (event.getClickCount() == 2 && (! row.isEmpty()) ) {
MyType rowData = row.getItem();
System.out.println(rowData);
}
});
return row ;
});
這是一個完整的工作示例:
import java.util.Random;
import java.util.function.Function;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class TableViewDoubleClickOnRow extends Application {
@Override
public void start(Stage primaryStage) {
TableView table = new TableView<>();
table.setRowFactory(tv -> {
TableRow row = new TableRow<>();
row.setOnMouseClicked(event -> {
if (event.getClickCount() == 2 && (! row.isEmpty()) ) {
Item rowData = row.getItem();
System.out.println("Double click on: "+rowData.getName());
}
});
return row ;
});
table.getColumns().add(column("Item", Item::nameProperty));
table.getColumns().add(column("Value", Item::valueProperty));
Random rng = new Random();
for (int i = 1 ; i <= 50 ; i++) {
table.getItems().add(new Item("Item "+i, rng.nextInt(1000)));
}
Scene scene = new Scene(table);
primaryStage.setScene(scene);
primaryStage.show();
}
private static TableColumn column(String title, Function> property) {
TableColumn col = new TableColumn<>(title);
col.setCellValueFactory(cellData -> property.apply(cellData.getValue()));
return col ;
}
public static class Item {
private final StringProperty name = new SimpleStringProperty();
private final IntegerProperty value = new SimpleIntegerProperty();
public Item(String name, int value) {
setName(name);
setValue(value);
}
public StringProperty nameProperty() {
return name ;
}
public final String getName() {
return nameProperty().get();
}
public final void setName(String name) {
nameProperty().set(name);
}
public IntegerProperty valueProperty() {
return value ;
}
public final int getValue() {
return valueProperty().get();
}
public final void setValue(int value) {
valueProperty().set(value);
}
}
public static void main(String[] args) {
launch(args);
}
}
James_D answered 2020-02-07T15:59:54Z
19 votes
例:
table.setOnMousePressed(new EventHandler() {
@Override
public void handle(MouseEvent event) {
if (event.isPrimaryButtonDown() && event.getClickCount() == 2) {
System.out.println(table.getSelectionModel().getSelectedItem());
}
}
});
如果使用自定義選擇模型,則可以從事件中獲取行,例如:
table.setOnMousePressed(new EventHandler() {
@Override
public void handle(MouseEvent event) {
if (event.isPrimaryButtonDown() && event.getClickCount() == 2) {
Node node = ((Node) event.getTarget()).getParent();
TableRow row;
if (node instanceof TableRow) {
row = (TableRow) node;
} else {
// clicking on text part
row = (TableRow) node.getParent();
}
System.out.println(row.getItem());
}
}
});
Alexander.Berg answered 2020-02-07T16:00:18Z
3 votes
這對我有用:
table.setOnMouseClicked((MouseEvent event) -> {
if (event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2){
System.out.println(table.getSelectionModel().getSelectedItem());
}
});
}
Abdul.Moqueet answered 2020-02-07T16:00:38Z
1 votes
如果使用的是SceneBuilder,則可以將表的OnMouseClicked設置為handleRowSelect()的方法,如下所示:
MyType temp;
Date lastClickTime;
@FXML
private void handleRowSelect() {
MyType row = myTableView.getSelectionModel().getSelectedItem();
if (row == null) return;
if(row != temp){
temp = row;
lastClickTime = new Date();
} else if(row == temp) {
Date now = new Date();
long diff = now.getTime() - lastClickTime.getTime();
if (diff < 300){ //another click registered in 300 millis
System.out.println("Edit dialog");
} else {
lastClickTime = new Date();
}
}
}
Sushal Penugonda answered 2020-02-07T16:00:58Z
0 votes
這個答案已經過測試:
table.setOnMouseClicked( event -> {
if( event.getClickCount() == 2 ) {
System.out.println( table.getSelectionModel().getSelectedItem());
}});
因為我們可以雙擊鼠標,所以可以使用table.getSelectionModel().getSelectedItem()。 第一個單擊將移動選擇,第二個將執行此處理程序。
Aubin answered 2020-02-07T16:01:23Z
0 votes
我有類似的情況,無法檢測到TableView上的鼠標雙擊事件。最重要的是,所有樣品均表現完美。 但我的應用程序根本沒有檢測到雙擊事件。
但是我發現,如果TableView處于可編輯狀態,則無法檢測到鼠標雙擊事件!
檢查您的應用程序是否TableView處于這種可編輯狀態。
tableView.setEditable( true );
如果是,則雙擊事件僅在所選的同一行上引發。
nayasis answered 2020-02-07T16:01:56Z
總結
以上是生活随笔為你收集整理的java tableview 双击_java-在TableView JavaFX的行上检测双击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java scala 混合编程_java
- 下一篇: java super this_Java