Javafx:限制拖放时的列重新排列
Javafx : Restrict Column rearrangement on drag and drop
在树 table 视图中,我们可以通过拖动列 headers 来 re-arrange 列。
我想限制用户单独拖动 第一列 。这意味着我的第一列应该一直是第一列。
这可能吗?
提前致谢。
没有 API。根据 this post 的解决方案是使用 ChangeListener 恢复更改。
在你的情况下,你必须检查第一列是否发生变化,然后才恢复。
这是一个例子:
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class TreeTableTest extends Application {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void start(Stage stage) {
final TreeTableView treeTableView = new TreeTableView();
TreeTableColumn c1 = new TreeTableColumn("1");
TreeTableColumn c2 = new TreeTableColumn("2");
TreeTableColumn c3 = new TreeTableColumn("3");
TreeTableColumn c4 = new TreeTableColumn("4");
treeTableView.getColumns().setAll(c1, c2, c3, c4);
treeTableView.getColumns().addListener(new ListChangeListener() {
public boolean suspended;
@Override
public void onChanged(Change change) {
change.next();
if (change.wasReplaced() && !suspended) {
List<TreeTableColumn> oldList = new ArrayList<>(change.getRemoved());
List<TreeTableColumn> newList = new ArrayList<>(treeTableView.getColumns());
// first column changed => revert to original list
if (oldList.get(0) != newList.get(0)) {
this.suspended = true;
treeTableView.getColumns().setAll(oldList);
this.suspended = false;
}
}
}
});
stage.setScene(new Scene(treeTableView));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这是一个简单的示例,我将列排列存储在一个临时列表中,每当我们尝试移动或替换第一列时,我们都会重置列排列。
!change.getList().get(0).equals(col1)
检查 col1
是否仍然在更改后的第一个位置。如果不是,我们将其替换为旧列表。
MCVE
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class FixFiestColumnTable extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
final TableView tableView = new TableView();
TableColumn col1 = new TableColumn("Col 1");
TableColumn col2 = new TableColumn("Col 2");
TableColumn col3 = new TableColumn("Col 3");
tableView.getColumns().setAll(col1, col2, col3);
tableView.getColumns().addListener(new ListChangeListener() {
public ObservableList<TableColumn> tempList = FXCollections.observableArrayList();
@Override
public void onChanged(Change change) {
change.next();
if (change.wasReplaced() && !change.getList().get(0).equals(col1)) {
tableView.getColumns().setAll(tempList);
}
tempList.setAll(change.getList());
}
});
stage.setScene(new Scene(tableView));
stage.show();
}
}
在树 table 视图中,我们可以通过拖动列 headers 来 re-arrange 列。 我想限制用户单独拖动 第一列 。这意味着我的第一列应该一直是第一列。
这可能吗?
提前致谢。
没有 API。根据 this post 的解决方案是使用 ChangeListener 恢复更改。
在你的情况下,你必须检查第一列是否发生变化,然后才恢复。
这是一个例子:
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class TreeTableTest extends Application {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void start(Stage stage) {
final TreeTableView treeTableView = new TreeTableView();
TreeTableColumn c1 = new TreeTableColumn("1");
TreeTableColumn c2 = new TreeTableColumn("2");
TreeTableColumn c3 = new TreeTableColumn("3");
TreeTableColumn c4 = new TreeTableColumn("4");
treeTableView.getColumns().setAll(c1, c2, c3, c4);
treeTableView.getColumns().addListener(new ListChangeListener() {
public boolean suspended;
@Override
public void onChanged(Change change) {
change.next();
if (change.wasReplaced() && !suspended) {
List<TreeTableColumn> oldList = new ArrayList<>(change.getRemoved());
List<TreeTableColumn> newList = new ArrayList<>(treeTableView.getColumns());
// first column changed => revert to original list
if (oldList.get(0) != newList.get(0)) {
this.suspended = true;
treeTableView.getColumns().setAll(oldList);
this.suspended = false;
}
}
}
});
stage.setScene(new Scene(treeTableView));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这是一个简单的示例,我将列排列存储在一个临时列表中,每当我们尝试移动或替换第一列时,我们都会重置列排列。
!change.getList().get(0).equals(col1)
检查 col1
是否仍然在更改后的第一个位置。如果不是,我们将其替换为旧列表。
MCVE
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class FixFiestColumnTable extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
final TableView tableView = new TableView();
TableColumn col1 = new TableColumn("Col 1");
TableColumn col2 = new TableColumn("Col 2");
TableColumn col3 = new TableColumn("Col 3");
tableView.getColumns().setAll(col1, col2, col3);
tableView.getColumns().addListener(new ListChangeListener() {
public ObservableList<TableColumn> tempList = FXCollections.observableArrayList();
@Override
public void onChanged(Change change) {
change.next();
if (change.wasReplaced() && !change.getList().get(0).equals(col1)) {
tableView.getColumns().setAll(tempList);
}
tempList.setAll(change.getList());
}
});
stage.setScene(new Scene(tableView));
stage.show();
}
}