Javafx проблема с кнопкой удаления

0
04 мая 2020 10:42
Всем привет. столкнулся вот с такой проблемой . при удаление строчки из таблицы идёт всё хорошо . но когда удаляю послед. строчку в таблице. то есть таблица без данных вылетает исключение . по старому коду было вот так я отметил стрелками !
но не много переделав сделал так из-за того что есть фильтр в коде ! отметил ёлкой.
BDel.setOnAction(actionEvent -> {
           Alert aler = new Alert(Alert.AlertType.CONFIRMATION);
           aler.setTitle("~Инфо~");
           aler.setHeaderText("Удалить строку в таблице ?");
           Optional<ButtonType> option = aler.showAndWait();
           if (option.get() == null) {
           } else if (option.get() == ButtonType.OK) {
               int selectedIndex = table_1.getSelectionModel().getSelectedIndex();    // <---------------
               if (selectedIndex >= 0) {                                                                 // <------------------
                   table_1.getSelectionModel().getSelectedItems().forEach(TableData::remove);     <<<<< сделал так но при удаление ласт строчки ошибка
                 //  table_1.getItems().remove(selectedIndex);                                 //<-----------------
               } else {
                   Alert alert = new Alert(Alert.AlertType.WARNING);
                   alert.setTitle("~Инфо~");
                   alert.setHeaderText(null);
                   alert.setContentText("Не выбрано не одной строчки в таблицы !");
                   alert.showAndWait();
               }
           }

    });

вот тут ошибка

Я тут свой Фильтр покажу . может тут где то косяк я уже хз

    FilteredList<Data_Table_1> filteredData = new FilteredList<>(TableData,e -> true);
            Text_Filter.textProperty().addListener((observable,oldValue,newValue) -> {
                filteredData.setPredicate((Predicate<? super Data_Table_1>) info -> {
                    if (newValue == null || newValue.isEmpty()) {
                        return true;
                    }
                    String lowerCaseFilter = newValue.toLowerCase();
                    if (String.valueOf(info.getName_org()).toLowerCase().contains(lowerCaseFilter)) {
                        return true;
                    } else if (String.valueOf(info.getInn()).toLowerCase().contains(lowerCaseFilter)) {
                        return true;
                    }
                    return false;
                });
            });
        SortedList<Data_Table_1> sortedData = new SortedList<>(filteredData);
        sortedData.comparatorProperty().bind(table_1.comparatorProperty());
             table_1.setItems(sortedData);

Ответов: 3

1
04 мая 2020 15:32
Скорей всего коллекция непотокобезопасная, например, какой-нибудь ArrayList. Поэтому нельзя удалять у неё элементы, используя её итератор для обхода.
1
04 мая 2020 12:28
Мало инфы даёшь. Либо минимально воспроизводимый пример нужен, либо больше инфы по исключениям.

Проблему можно решить несколькими способами, но блин, я с телефона печатаю)).

Первый способ добавить проверку, что в таблице остался последний элемент:
    if (table.getItems().size() == 1) {
        table.getItems().removeAll(person);
    }


table - это TableView
person - экземпляр коллекции.

Еще один способ через копию коллекции:
    ArrayList<Person> copyTable = new ArrayList<>(table.getSelectionModel().getSelectedItems());
    copyTable.forEach(s -> { table.getItems().remove(s); });


Есть ещё способы.

И проблема не с кнопкой, а с методом удаления.

В моем примере нет фильтра, но дело вероятно не в нём.
У меня всё отлично работает! Удаление правой кнопкой мыши. Второй вариант закоментирован.
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

public class TestTableView extends Application {
    public static class TableData {
        SimpleStringProperty one, two, three;

        public TableData(String one, String two, String three) {
            this.one = new SimpleStringProperty(one);
            this.two = new SimpleStringProperty(two);
            this.three = new SimpleStringProperty(three);
        }

        public String getOne() {
            return one.get();
        }

        public void setOne(String one) {
            this.one.set(one);
        }

        public String getThree() {
            return three.get();
        }

        public void setThree(String three) {
            this.three.set(three);
        }

        public String getTwo() {
            return two.get();
        }

        public void setTwo(String two) {
            this.two.set(two);
        }
    }

    public static void main(String[] args) {
        launch();
    }

    @Override
    public void start(Stage stage) throws Exception {
        TableView<TableData> table_1 = new TableView<>();
        ObservableList<TableData> myTableData = FXCollections.observableArrayList(
                new TableData("Dilettante", "05.05.2020", "[email protected]"),
                new TableData("DilettanteA", "05.05.4040", "[email protected]"),
                new TableData("DilettanteB", "05.05.3030", "[email protected]"));

        var firstColumn = new TableColumn<TableData, String>("First Column");
        var secondColumn = new TableColumn<TableData, String>("Second Column");
        var thirdColumn = new TableColumn<TableData, String>("Third Column");
        firstColumn.setCellValueFactory(new PropertyValueFactory<>("one"));
        secondColumn.setCellValueFactory(new PropertyValueFactory<>("two"));
        thirdColumn.setCellValueFactory(new PropertyValueFactory<>("three"));


        table_1.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> {
            if (event.getButton() == MouseButton.SECONDARY) {
//                Вариант ОДИН ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                if (table_1.getItems().size() == 1) {
                    table_1.getItems().removeAll(myTableData);
                }
                table_1.getSelectionModel().getSelectedItems().forEach(item -> table_1.getItems().remove(item));

//                Вариант ДВА +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                var copyTable = new ArrayList<TableData>(table_1.getSelectionModel().getSelectedItems());
//                copyTable.forEach(s -> table_1.getItems().remove(s));
            }
        });

        table_1.setItems(myTableData);
        table_1.getColumns().addAll(firstColumn, secondColumn, thirdColumn);

        stage.setScene(new Scene(table_1));
        stage.setWidth(600);
        stage.setWidth(400);
        stage.centerOnScreen();
        stage.show();
    }
}
0
05 мая 2020 17:56
Всем спасибо. решил свой вопрос. вот так ! не знаю правильно, но хотя-бы не ругается :D
 BDel.setOnAction(actionEvent -> {
            Alert aler = new Alert(Alert.AlertType.CONFIRMATION);
            aler.setTitle("~Инфо~");
            aler.setHeaderText("Удалить строку в таблице ?");
            Optional<ButtonType> option = aler.showAndWait();
            if (option.get() == null) {
            } else if (option.get() == ButtonType.OK) {
                int selectedIndex = table_1.getSelectionModel().getSelectedIndex();
                if (selectedIndex >= 0) {
                  int sourceIndex = sortedList.getSourceIndexFor(TableData, selectedIndex);
                    TableData.remove(sourceIndex);

                    //    table_1.getSelectionModel().getSelectedItems().forEach(TableData::remove);
                    //   table_1.getItems().remove(selectedIndex);

                } else {
                    Alert alert = new Alert(Alert.AlertType.WARNING);
                    alert.setTitle("~Инфо~");
                    alert.setHeaderText(null);
                    alert.setContentText("Не выбрано не одной строчки в таблицы !");
                    alert.showAndWait();
                }
            }

        });
Модераторы: Нет
Сейчас эту тему просматривают: Нет