gpt4 book ai didi

javafx - 通过拖放(行)对 tableview 进行排序

转载 作者:行者123 更新时间:2023-12-04 04:46:15 26 4
gpt4 key购买 nike

我的目标是通过拖放对 tableview 进行排序。
我跟着这个例子:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm

对于拖放,我通过 Scene Builder 添加了 fxml

<TableView fx:id="tableView" onDragDetected="#dragDetected" onDragDropped="#dragDropped" onDragOver="#dragOver"

并制作 Controller
@FXML
private void dragDetected(MouseEvent event) {
System.out.println("dragDetected");

Integer idx;
idx = tableView.getSelectionModel().getFocusedIndex();
Dragboard db = tableView.startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putString(idx.toString());
db.setContent(content);

System.out.println(idx);
// System.out.println(event.getPickResult());
event.consume();
}

@FXML
private void dragOver(DragEvent event) {
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
event.consume();
}

@FXML
private void dragDropped(DragEvent event) {
System.out.println("dragDropped");

System.out.println(event.getTarget());
System.out.println(event.getPickResult());
}

但是在拖放时,我无法获得放置对象的位置的行。我得到的只是细胞信息。 Text[text="Smith", x=0.0, y=0.0, ...
我如何获得这份工作?
也许 Class TableRow<T>可以提供帮助,但我不明白如何使用它。

最佳答案

正如您所怀疑的,答案是使用 TableRow .您可以通过在表上设置行工厂来完成此操作,该行工厂用于根据需要创建表行。您可以创建它们并在返回它们之前在它们上设置拖动处理程序。

因此,删除 onDragDetected , onDragDropped FXML 中的 etc 属性,并在 Controller 的 initialize 方法中设置行上的拖动处理程序。

这是一个完整的示例,使用 Oracle 教程中的常用示例。在这个例子中我没有使用 FXML(我只是直接在 Java 类中创建了表 View ),但是你可以将所有表 View 配置移动到 initialize 方法中。

import java.util.function.Function;

import javafx.application.Application;
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.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TableViewDragRows extends Application {

private static final DataFormat SERIALIZED_MIME_TYPE = new DataFormat("application/x-java-serialized-object");

@Override
public void start(Stage primaryStage) {
TableView<Person> tableView = new TableView<>();
tableView.getColumns().add(createCol("First Name", Person::firstNameProperty, 150));
tableView.getColumns().add(createCol("Last Name", Person::lastNameProperty, 150));
tableView.getColumns().add(createCol("Email", Person::emailProperty, 200));

tableView.getItems().addAll(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com")
);

tableView.setRowFactory(tv -> {
TableRow<Person> row = new TableRow<>();

row.setOnDragDetected(event -> {
if (! row.isEmpty()) {
Integer index = row.getIndex();
Dragboard db = row.startDragAndDrop(TransferMode.MOVE);
db.setDragView(row.snapshot(null, null));
ClipboardContent cc = new ClipboardContent();
cc.put(SERIALIZED_MIME_TYPE, index);
db.setContent(cc);
event.consume();
}
});

row.setOnDragOver(event -> {
Dragboard db = event.getDragboard();
if (db.hasContent(SERIALIZED_MIME_TYPE)) {
if (row.getIndex() != ((Integer)db.getContent(SERIALIZED_MIME_TYPE)).intValue()) {
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
event.consume();
}
}
});

row.setOnDragDropped(event -> {
Dragboard db = event.getDragboard();
if (db.hasContent(SERIALIZED_MIME_TYPE)) {
int draggedIndex = (Integer) db.getContent(SERIALIZED_MIME_TYPE);
Person draggedPerson = tableView.getItems().remove(draggedIndex);

int dropIndex ;

if (row.isEmpty()) {
dropIndex = tableView.getItems().size() ;
} else {
dropIndex = row.getIndex();
}

tableView.getItems().add(dropIndex, draggedPerson);

event.setDropCompleted(true);
tableView.getSelectionModel().select(dropIndex);
event.consume();
}
});

return row ;
});


Scene scene = new Scene(new BorderPane(tableView), 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}

private TableColumn<Person, String> createCol(String title,
Function<Person, ObservableValue<String>> mapper, double size) {

TableColumn<Person, String> col = new TableColumn<>(title);
col.setCellValueFactory(cellData -> mapper.apply(cellData.getValue()));
col.setPrefWidth(size);

return col ;
}


public class Person {
private final StringProperty firstName = new SimpleStringProperty(this, "firstName");
private final StringProperty lastName = new SimpleStringProperty(this, "lastName");
private final StringProperty email = new SimpleStringProperty(this, "email");

public Person(String firstName, String lastName, String email) {
this.firstName.set(firstName);
this.lastName.set(lastName);
this.email.set(email);
}

public final StringProperty firstNameProperty() {
return this.firstName;
}

public final String getFirstName() {
return this.firstNameProperty().get();
}

public final void setFirstName(final String firstName) {
this.firstNameProperty().set(firstName);
}

public final StringProperty lastNameProperty() {
return this.lastName;
}

public final String getLastName() {
return this.lastNameProperty().get();
}

public final void setLastName(final String lastName) {
this.lastNameProperty().set(lastName);
}

public final StringProperty emailProperty() {
return this.email;
}

public final String getEmail() {
return this.emailProperty().get();
}

public final void setEmail(final String email) {
this.emailProperty().set(email);
}

}

public static void main(String[] args) {
launch(args);
}
}

关于javafx - 通过拖放(行)对 tableview 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28603224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com