微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在JavaFx中创建可重新排序的TableView

我有一个 JavaFx TableView.我想允许用户单击并拖动以重新排序表行.我似乎无法找到任何方法来做到这一点,但它似乎在GUI中非常常见.

解决方法

下面是一些通过拖动行来重新排序ListView中的行的代码.

拖动鸟类重新排序.

TableView的实现有点类似.

import javafx.application.Application;
import javafx.collections.*;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.input.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.*;

public class ListOrganizer extends Application {
    private static final String PREFIX =
            "http://icons.iconarchive.com/icons/jozef89/origami-birds/72/bird";

    private static final String SUFFIX =
            "-icon.png";

    private static final ObservableList<String> birds = FXCollections.observableArrayList(
            "-black","-blue","-red","-red-2","-yellow","s-green","s-green-2"
    );

    private static final ObservableList<Image> birdImages = FXCollections.observableArrayList();

    @Override
    public void start(Stage stage) throws Exception {
        birds.forEach(bird -> birdImages.add(new Image(PREFIX + bird + SUFFIX)));

        ListView<String> birdList = new ListView<>(birds);
        birdList.setCellFactory(param -> new BirdCell());
        birdList.setPrefWidth(180);

        VBox layout = new VBox(birdList);
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }

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

    private class BirdCell extends ListCell<String> {
        private final ImageView imageView = new ImageView();

        public BirdCell() {
            ListCell thisCell = this;

            setContentdisplay(Contentdisplay.GRAPHIC_ONLY);
            setAlignment(Pos.CENTER);

            setonDragDetected(event -> {
                if (getItem() == null) {
                    return;
                }

                ObservableList<String> items = getListView().getItems();

                Dragboard dragboard = startDragAndDrop(TransferMode.MOVE);
                ClipboardContent content = new ClipboardContent();
                content.putString(getItem());
                dragboard.setDragView(
                    birdImages.get(
                        items.indexOf(
                            getItem()
                        )
                    )
                );
                dragboard.setContent(content);

                event.consume();
            });

            setonDragOver(event -> {
                if (event.getGestureSource() != thisCell &&
                       event.getDragboard().hasstring()) {
                    event.acceptTransferModes(TransferMode.MOVE);
                }

                event.consume();
            });

            setondragentered(event -> {
                if (event.getGestureSource() != thisCell &&
                        event.getDragboard().hasstring()) {
                    setopacity(0.3);
                }
            });

            setonDragExited(event -> {
                if (event.getGestureSource() != thisCell &&
                        event.getDragboard().hasstring()) {
                    setopacity(1);
                }
            });

            setonDragDropped(event -> {
                if (getItem() == null) {
                    return;
                }

                Dragboard db = event.getDragboard();
                boolean success = false;

                if (db.hasstring()) {
                    ObservableList<String> items = getListView().getItems();
                    int draggedIdx = items.indexOf(db.getString());
                    int thisIdx = items.indexOf(getItem());

                    Image temp = birdImages.get(draggedIdx);
                    birdImages.set(draggedIdx,birdImages.get(thisIdx));
                    birdImages.set(thisIdx,temp);

                    items.set(draggedIdx,getItem());
                    items.set(thisIdx,db.getString());

                    List<String> itemscopy = new ArrayList<>(getListView().getItems());
                    getListView().getItems().setAll(itemscopy);

                    success = true;
                }
                event.setDropCompleted(success);

                event.consume();
            });

            setonDragDone(DragEvent::consume);
        }

        @Override
        protected void updateItem(String item,boolean empty) {
            super.updateItem(item,empty);

            if (empty || item == null) {
                setGraphic(null);
            } else {
                imageView.setimage(
                    birdImages.get(
                        getListView().getItems().indexOf(item)
                    )
                );
                setGraphic(imageView);
            }
        }
    }

    // Iconset Homepage: http://jozef89.deviantart.com/art/Origami-Birds-400642253
    // License: CC Attribution-Noncommercial-No Derivate 3.0
    // Commercial usage: Not allowed    

}

原文地址:https://www.jb51.cc/java/128183.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐