JavaFX-如何让ListView自动更新?

JavaFX-如何让ListView自动更新?,java,listview,Java,Listview,我正试图让我的ListView自动更新,这通常不会是一个问题,但更新是从不同控制器中的方法调用的。这是我的困境 MainSceneControl.java package appController; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.ResourceBundle;

我正试图让我的ListView自动更新,这通常不会是一个问题,但更新是从不同控制器中的方法调用的。这是我的困境

MainSceneControl.java

package appController;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;

import appData.Admin;
import appData.Album;
import appData.User;
import appDesign.PhotoAlbum;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class MainSceneController implements Initializable {

    @FXML
    ListView<Album> listViewofAlbums = new ListView<Album>();
    @FXML
    TextField albumField;
    @FXML
    TextField numField;
    @FXML 
    TextField lastPhotoField;
    @FXML
    TextField photoRangeField;

    public static Album selectedAlbum;

    public void logout(ActionEvent event) throws Exception {
        PhotoAlbum.primaryStage.show();
        ((Node) (event.getSource())).getScene().getWindow().hide();
    }

    public void addAlbum(ActionEvent event) throws Exception {

        createStage(event, "PhotoExpress - Create New Album", "/appDesign/CreateAlbumDialog.fxml", 526, 249);

    }

    public void rename(ActionEvent event) throws Exception {

        createStage(event, "PhotoExpress - Rename Album", "/appDesign/RenameDialog.fxml", 526, 249);

    }

    public void deleteAlbum(ActionEvent event) throws Exception {

        createStage(event, "PhotoExpress - Confirm Delete", "/appDesign/DeleteAlbumDialog.fxml", 503, 141);

    }

    public void openSearchStage(ActionEvent event) throws Exception {

        createStage(event, "PhotoExpress - Search", "/appDesign/SearchScene.fxml", 868, 534);

    }

    public void createStage(ActionEvent event, String windowTitle, String fxmlLocation, int x, int y) throws Exception {
        Parent root;
        Stage stage;
        try {
            root = FXMLLoader.load(getClass().getResource(fxmlLocation));
            stage = new Stage();
            stage.setTitle(windowTitle);
            stage.setScene(new Scene(root, x, y));
            stage.initModality(Modality.WINDOW_MODAL);
            stage.initOwner(((Node) event.getSource()).getScene().getWindow());
            stage.getIcons().add(new Image("/appDesign/icon.png"));
            stage.show();

            // ((Node)(event.getSource())).getScene().getWindow().hide();

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

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        User temp = LoginSceneController.getLoggedInUser();
        listViewofAlbums.setItems(FXCollections.observableList(User.getUserAlbums(temp)));
        listViewofAlbums.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue == null) {
                return;
            }

            albumField.setDisable(true);
            numField.setDisable(true);
            lastPhotoField.setDisable(true);
            photoRangeField.setDisable(true);

            albumField.setText(newValue.getName());
            numField.setText(newValue.getSize());
            selectedAlbum = newValue;



        }
        );

        listViewofAlbums.getSelectionModel().select(0);
    }

}
package appController;

import appData.Admin;
import appData.User;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.scene.Node;

public class RenameAlbumController {

    @FXML
    TextField newAlbumName;

    public void renameAlbum(ActionEvent event){

        Admin.renameAlbum(MainSceneController.selectedAlbum.getName(), newAlbumName.getText());
        ((Node)(event.getSource())).getScene().getWindow().hide();

    }

}
我目前无法从除MainSceneControl之外的任何其他地方访问或刷新我的listViewofAlbums变量。我尝试了这么多的解决办法,但都没有奏效


有什么想法吗?

从“另一个控制器”触发ListView更新的一种方法是发送广播消息,并在主要活动中“捕获”它

两步:
1) 在“不同的控制器”中,弹出一条消息,指示listview现在需要更新

2) 在包含ListAdapter的相关活动中,创建一个侦听器来“捕获”消息,并触发更新

(1)发送广播消息:

Intent intent = new Intent(msgUpdateListView);
LocalBroadcastManager.getInstance(getApplicationContext().sendBroadcast(intent);
(2)捕捉广播信息(在活动中):

public class MyActivity extends Activity{
  private BroadcastReceiver mBroadcastReceiver;
  private ListAdapter listadapter;

  @Override
  public void onStart(){
    super.onStart();
    //initialise listadapter here...
    mBroadcastReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
            //we got a message, so update our listview...
            listadapter.notifyDataSetChanged();
        }
    };
  }

  @Override
  public void onResume(){
    super.onResume();
    IntentFilter filter = new IntentFilter(msgUpdateListView);
    LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, filter);
  }

  @Override
  public void onPause(){
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mBroadcastReceiver);
  }
双方可见的消息传递常量(筛选器)
final String msgUpdateListView=“我的列表视图需要更新”