Javafx:限制拖放时的列重新排列

时间:2015-06-04 13:49:24

标签: javafx javafx-8

在树表视图中,我们可以通过拖动列标题重新排列列。 我想限制用户单独拖动第一列。这意味着我的第一列应该始终是第一列。

这可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

没有API。根据{{​​3}}的解决方案是使用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);
    }
}

答案 1 :(得分:0)

这是一个简单的例子,我将列排列存储在临时列表中,当我们尝试移动或替换第一列时,我们正在重置列排列。

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