使用拖放(行)对tableview进行排序 [英] sort tableview with drag and drop (rows)

查看:198
本文介绍了使用拖放(行)对tableview进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

my aim is to sort a tableview with drag and drop. I followed this example: http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm

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

For drag and drop I added the fxml via Scene Builder

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

并制作控制器

@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 =Smith,x = 0.0,y = 0.0,...

but at drag dropped I cant get the row of the place where I dropped the object. All I get is the cell Information. Text[text="Smith", x=0.0, y=0.0, ...

我如何得到这个工作?
也许 Class TableRow< T> 可以提供帮助,但我不明白如何正确使用它。

How do I get this work? Maybe Class TableRow<T> could help, but I do not understand how to use it proberly.

推荐答案

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

As you suspected, the answer is to use a TableRow. You do this by setting a row factory on your table, which is used to create the table rows as they are needed. You can create them and set the drag handlers on them before returning them.

因此,删除 onDragDetected ,<来自FXML的code> onDragDropped etc属性,以及控制器中的initialize方法设置行上的拖动处理程序。

So, remove the onDragDetected, onDragDropped etc attributes from the FXML, and in the initialize method in the controller set the drag handlers on the row.

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

Here is a complete example, using the usual example from the Oracle tutorials. I didn't use FXML in this example (I just created the table view directly in the Java class), but you can just move all the table view configuration to the initialize method.

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);
    }
}

这篇关于使用拖放(行)对tableview进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆