How to disable column reordering in JavaFX2 TableView?

JavaFX2 TableView "Reordering columns by user at runtime." I would like to disable this feature for one specific table in my application.

Looking at the API, there is no obvious API for this. However, there are columns -property. According to the document, he represents

TableColumns that are part of this TableView. When the user reorders the columns of the TableView, this list will be updated to display the current visual ordering.

Hoping that at least I could reset change after it occurred, I tried adding a listener to reset changes after the fact.

 import javafx.application.Application; import javafx.collections.ListChangeListener; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.stage.Stage; public class TableTest extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { TableView tableView = new TableView(); tableView.getColumns().setAll(new TableColumn(), new TableColumn()); tableView.getColumns().addListener(new ListChangeListener() { @Override public void onChanged(Change change) { if (change.wasPermutated()){ change.reset(); } } }); stage.setScene(new Scene(tableView)); stage.show(); } } 

However, the listener aborts with an IllegalStateException when I request wasPermutated .
Is there a way to prevent reordering, or at least return it programmatically?

+6
source share
1 answer

See below SSCCE, which shows that the listener is being called - but when moving columns the flag is set to added . Note that you need to call next() before using this change, or you will get an IllegalStateException . See javadoc ListChangeListener.Change for a simple canonical example.

 import javafx.application.Application; import javafx.collections.ListChangeListener; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.stage.Stage; public class TableTest extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { final TableView tableView = new TableView(); final TableColumn[] columns = {new TableColumn("1"), new TableColumn("2")}; tableView.getColumns().setAll(columns); tableView.getColumns().addListener(new ListChangeListener() { public boolean suspended; @Override public void onChanged(Change change) { change.next(); if (change.wasReplaced() && !suspended) { this.suspended = true; tableView.getColumns().setAll(columns); this.suspended = false; } } }); stage.setScene(new Scene(tableView)); stage.show(); } } 
+8
source

Source: https://habr.com/ru/post/915776/


All Articles