selectFirst () на javafx ListView не выбирает элемент - PullRequest
0 голосов
/ 17 марта 2019

У меня есть небольшое приложение для управления своими задачами.Я создал БД (sqlite) и храню там данные.

После того, как я вошел в систему, я получил сцену панели инструментов.На сцене панели инструментов я реализовал ObservableList, который хранит список задач и их детали.Этот список обновляется всегда, когда я добавляю / изменяю / удаляю задачи.

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

Основной код:

public class Main extends Application {

    private static Main instance;

    public BorderPane mainBorderPane;
    private Stage primaryStage;

    public static Main getInstance() {
        return instance;
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        instance = this;
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Hello World");
        showDashboardScene();
    }

    private void showDashboardScene() throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/sample/dashboard.fxml"));
        mainBorderPane = loader.load();
        Scene scene = new Scene(mainBorderPane);
        primaryStage.setScene(scene);
        primaryStage.initStyle(StageStyle.UTILITY);
        primaryStage.show();
    }

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

DashboardController:

public class DashboardController {

    private ObservableList<Task> tasks = FXCollections.observableArrayList();

    @FXML
    private ListView<Task> taskListView;

    public void initialize() throws SQLException {
        tasks = TaskData.getInstance().getTaskList();
        findListChange();
        taskListView.setItems(tasks);
        taskListView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        taskListView.getSelectionModel().selectFirst();
    }

    public void refreshView() {
        tasks = TaskData.getInstance().getTaskList();
        findListChange();
        taskListView.setItems(tasks);
        taskListView.getSelectionModel().selectedItemProperty();
        taskListView.getSelectionModel().selectLast();
    }

    private void findListChange() {
        this.taskListView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Task>() {
            @Override
            public void changed(ObservableValue<? extends Task> observable, Task oldValue, Task newValue) {
                if (newValue != null) {
                    Task item = taskListView.getSelectionModel().getSelectedItem();
                }
            }
        });
    }
}

dashboard.fxml

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.ListView?>

<BorderPane fx:controller="sample.DashboardController" xmlns:fx="http://javafx.com/fxml" >
    <top>
        <fx:include fx:id="mainMenu" source="/sample/menu.fxml"/>
    </top>
    <left>
        <ListView fx:id="taskListView"/>
    </left>
</BorderPane>

MenuController

public class MenuController {

    public void showDialog() throws SQLException, IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/sample/addTask.fxml"));
        loader.load();
        AddTaskController controller = loader.getController();
        controller.showAddTaskDialog();
    }
}

menu.fxml

<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuItem?>

<MenuBar fx:controller="sample.MenuController" xmlns="http://javafx.com/javafx"
         xmlns:fx="http://javafx.com/fxml ">
    <Menu text="Tasks">
        <MenuItem text="Add" onAction="#showDialog"/>
    </Menu>

</MenuBar>

addTask.fxml

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

<?import javafx.scene.control.*?>

<?import javafx.scene.layout.GridPane?>
<DialogPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml"
            fx:controller="sample.AddTaskController">
    <content>
        <GridPane vgap="10" hgap="10" >
            <Label text="Name" GridPane.rowIndex="0" GridPane.columnIndex="0"/>
            <TextField fx:id="taskNameTF" GridPane.rowIndex="0" GridPane.columnIndex="1"/>
        </GridPane>
    </content>
</DialogPane>

AddTaskController:

public class AddTaskController {

    @FXML
    private TextField taskNameTF;

    @FXML
    public void showAddTaskDialog()throws IOException, SQLException {
        Dialog<ButtonType> dialog = new Dialog<>();
        dialog.initOwner(Main.getInstance().mainBorderPane.getScene().getWindow());
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/sample/addTask.fxml"));

        try {
            dialog.getDialogPane().setContent(loader.load());
        } catch (IOException e) {e.printStackTrace();
            System.out.println("Nie udało sie wyświetlić panelu, prosimy spróbować później");
            e.printStackTrace();
            return;
        }

        dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
        dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);

        Optional<ButtonType> result = dialog.showAndWait();

        if(result.isPresent() && result.get().equals(ButtonType.OK)) {
            AddTaskController controller = loader.getController();
            controller.addTaskToList();

            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("/sample/dashboard.fxml"));
            fxmlLoader.load();

            DashboardController dashboardController = fxmlLoader.getController();
            dashboardController.refreshView();

            System.out.println("OK, pressed");
        } else {
            System.out.println("CANCEL, pressed");
        }
    }

    private void addTaskToList() {
        String taskName = taskNameTF.getText().trim();
        TaskData.getInstance().addTaskToList(new Task(taskName));
    }
}

Task

public class Task {

    private String taskName;

    public Task(String taskName) {
        this.taskName = taskName;
    }

    @Override
    public String toString() {
        return taskName.toString();
    }
}

TaskData

public class TaskData {

    private ObservableList<Task> tasks = FXCollections.observableArrayList();

    private static TaskData instance = new TaskData();

    public static TaskData getInstance() {
        return instance;
    }

    public ObservableList<Task> getTaskList() {
        return tasks;
    }

    public void addTaskToList(Task task) {
        instance.tasks.add(task);
    }
}

Я не уверен, но когда я инициализирую приложение, ссылка на ListView отличается от ссылки на список при добавлении / изменении элемента.Я думаю, что это проблема, но я не знаю, как это исправить; /

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