How to create a reordering tableview in JavaFX
•
Java
I have a JavaFX tableview I want to allow users to click and drag to reorder table rows I can't seem to find any way to do this, but it seems to be very common in GUI
Solution
Here are some code to reorder rows in listview by dragging rows
Drag to reorder
The implementation of tableview is somewhat similar
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.V@R_113_2419@; 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); V@R_113_2419@ layout = new V@R_113_2419@(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 }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码