Предотвратить изменение порядка первого столбца в табличном представлении? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть таблица с несколькими столбцами, которые позволяют переупорядочивать.Таблица представляет собой список песен, каждая строка представляет песню.Первый столбец (самый левый) используется для отображения значка рядом со строкой, когда он «активен» (воспроизводится песня).Я хотел бы предотвратить изменение порядка столбцов слева от него и всегда сохранять его в качестве первого столбца таблицы.

Моя теория состоит в том, чтобы каким-то образом перехватывать действия переупорядочения и если столбец пытается вставить себякак столбец 0, отрицать изменение.Но я не могу понять, как это сделать, или, по крайней мере, найти, какие методы мне нужно использовать.Это была моя логика для выполнения этого в Swing в любом случае.

Я искал в Интернете, и единственные решения, которые я нашел, были для отключения переупорядочения всех столбцов.

1 Ответ

0 голосов
/ 14 мая 2019

JavaFx не предоставляет прямого решения, но может быть реализован обходной путь для предотвращения переупорядочения столбца.

Вы можете предотвратить это визуально, я имею в виду, если первый столбец находится в перемещенном списке.просто верните его туда, где вы хотите его видеть, это происходит так быстро, что пользователь даже не замечает этого.

Вот простой код, который вы можете проверить:

.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="stackoverflow.reorder.Controller">
    <TableView fx:id="table">
        <columns>
            <TableColumn fx:id="first" text="1"/>
            <TableColumn text="2"/>
            <TableColumn text="3"/>
            <TableColumn text="4"/>
            <TableColumn text="5"/>
        </columns>
    </TableView>
</AnchorPane>

Контроллер:

public class Controller implements Initializable {

    @FXML private TableView<Object> table;
    @FXML private TableColumn<Object, String> first;

    private ListChangeListener<? super TableColumn<Object, ?>> columnReorderListener = c -> {
        if (c.next()) {
            if (c.getAddedSubList().contains(first)) {
                table.getColumns().removeListener(listener());
                table.getColumns().remove(first);
                table.getColumns().add(0, first);
                table.getColumns().addListener(listener());
            }
        }
    };

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        // Its deprecated!!!
        first.impl_setReorderable(false);

        table.getColumns().addListener(columnReorderListener);
    }

    private ListChangeListener<? super TableColumn<Object, ?>> listener() {
        return columnReorderListener;
    }

}

Существует устаревший метод, который предотвращает перетаскивание самого столбца, но не позволяет перетаскивать его в любой другой столбец.,Ибо это слушатель.

...