【问题标题】:JAVAFX LISTVIEW REFRESH TABJAVAFX 列表视图刷新选项卡
【发布时间】:2015-05-29 05:09:37
【问题描述】:

我被困在学校项目中。

我有 javafx 项目,带有控制器 A 和控制器 B。 A 控制器与 Tab A 关联,B 控制器与 Tab B 关联。

在两个控制器中,我都有一个列表视图列出相同的对象(例如@FXML Listview moviesList)。

在选项卡 A 中,我可以从列表视图中删除电影。没问题,该对象已从列表视图中删除。

但是问题,当我打开 Tab B 时,对象仍然在 Listview 中。

而且我不知道删除对象后如何刷新这个列表视图。

Main.java

public class Main extends Application {

private Stage primaryStage;
private TabPane rootLayout;
private Tab tabMovie = new Tab("Movies");
private Tab tabRoom = new Tab("Rooms");


@Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Javaravi Admin");
        primaryStage.setResizable(false);

        loadScreen();

        showMovies();

        showRoomsAndShows();


    }


public void loadScreen() {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("menu.fxml"));
            rootLayout = fxmlLoader.load();

            // Show the scene containing the root layout.
            Scene scene = new Scene(rootLayout);
            scene.getStylesheets().add(Main.class.getResource("style.css").toExternalForm());
            rootLayout.getTabs().addAll(tabMovie, tabRoom, tabParam);
            primaryStage.setScene(scene);
            primaryStage.show();

        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }


public void showMovies() {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("movie.fxml"));
            AnchorPane filmView = fxmlLoader.load();

            // Set person overview into the center of root layout.

            tabMovie.setContent(filmView);

            // Give the controller access to the main app.
            MovieController controller = fxmlLoader.getController();


        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }



public void showRoomsAndShows() {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("system.fxml"));
            AnchorPane room = fxmlLoader.load();

            // Set person overview into the c enter of root layout.
            tabRoom.setContent(room);

            // Give the controller access to the main app.
            SystemController systemController = fxmlLoader.getController();


        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }

MovieController.java

public class MovieController {

    @FXML
    private ListView<Film> moviesListView;

    private Database db = Database.getInstance();
    private ModelFactory mf = ModelFactory.getInstance();

    public MovieController() {
    }

    private void showAllMovies() {

        List<Film> moviesList = new ArrayList<>();
        List<Model> modelsList = mf.getAllModels("Film");
        for (int i=0; i<modelsList.size(); i++) {
            moviesList.add((Film) modelsList.get(i));
        }
        ObservableList<Film> myObservableList = FXCollections.observableList(moviesList);
        setMoviesItems(myObservableList);
    }

    private void setMoviesItems(ObservableList<Film> item) {

        moviesListView.setItems(item);
    }

@FXML
    private void initialize() {

        showAllMovies();
    }

    @FXML
    private void deleteShow() {

        Film selectedFilm = moviesListView.getSelectionModel().getSelectedItem();

            System.out.println("Validation suppression");
            selectedFilm.removeFromDb();
            showAllMovies();
            moviesListView.requestFocus();
            moviesListView.getSelectionModel().select(0);
            getSelectedMovie();      

    }

显示.java

公共类 SystemController {

@FXML
private ListView<Film> selectedMovieResa;

@FXML
    private void initialize() {

        // initialize lists
        showAllLanguages();
        showAllShows();
        showAllMovies();
        showAllRooms();
    }

// set movies list
    private void showAllMovies() {

        // same process as the first one (line 158, set room list)
        List<Film> moviesList = new ArrayList<>();
        List<Model> modelsList = mf.getAllModels("Film");
        for (int i=0; i<modelsList.size(); i++) {
            moviesList.add((Film) modelsList.get(i));
        }
        ObservableList<Film> myObservableList = FXCollections.observableList(moviesList);
        setMoviesItems(myObservableList);
    }

    public void setMoviesItems(ObservableList<Film> item) {

        selectedMovieResa.setItems(item);
        movieFromShow.setItems(item);
        filterMovie.setItems(item);
    }

谢谢!

【问题讨论】:

  • 要么显示一个ListView,使其位于TabPane 之外(因此无论选择哪个选项卡都始终可见),或者让两个ListViews 共享同一个列表的项目。 (如果不提供示例应用程序,即MCVE,几乎不可能更全面地回答这个问题。)
  • 我编辑得尽可能好。

标签: listview javafx controller reload


【解决方案1】:

问题是您的每个ListViews 包含不同的ObservableList 与数据。因此,从一个列表中删除不会从另一个列表中删除。最好的解决方案是让两个列表视图共享一个数据列表。

让您的ModelFactory 类创建一个(单个)ObservableList&lt;Model&gt; 并通过getMovies() 方法返回它。类似的东西

public class ModelFactory {

    private ObservableList<Film> filmList = null ;

    // existing code...

    public ObservableList<Film> getMovies() {
        if (filmList == null) {
            List<Film> films = new ArrayList<>();
            List<Model> models = getAllModels("Film");
            for (Model m : models) {
                films.add((Film)m);
            }
            filmList = FXCollections.observableList(films);
        }
        return filmList ;
    }

    // ...
}

那么你只有一个列表可以被各种视图共享:

public class SystemController {

    // ...

    public void showAllMovies() {
        setMoviesItems(mf.getMovies());
    }

    // ...
}

public class MoviesController {

    // ...

    public void showAllMovies() {
        setMoviesItems(mf.getMovies());
    }

    // ...

    @FXML
    private void deleteShow() {
        Film selectedFilm = moviesListView.getSelectionModel().getSelectedItem();
        selectedFilm.removeFromDb();
        // since list is shared, this will be observed in all views...
        moviesListView.getItems().remove(selectedFilm); 
    }

    // ...
}

https://github.com/james-d/SharedListView 上有一个类似的、更简单(但完整)的示例

【讨论】:

  • 我正在测试您的解决方案并且.. 太棒了!谢谢,这非常好和简单。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多