无法从另一个控制器访问控制器及其方法

时间:2020-02-12 07:21:45

标签: java javafx controller fxml

我不确定100%如何最好地描述这个问题,但我会尽力而为。

我正在开发一个音乐应用程序,一个应用程序中有不同的窗口,并将窗格加载到如下所示的应用程序窗口中: enter image description here

enter image description here

从绿色按钮更改为播放列表屏幕的位是已加载FXML文件的窗口。

我最近创建了应用程序的一部分,该应用程序从该应用程序的这个小窗口中的按钮播放歌曲,但是媒体播放器位于主应用程序控制器中,因此需要在此位置,因为它会更新应用程序中两个滑块的值。底部。

我已经看到一些有关引用我用于主应用程序的控制器的确切实例的信息,但是我不确定如何执行此操作。我试图创建mainAppController的静态版本,但这是一个单独的实例,因此未正确引用。

我需要引用的唯一方法是addPlayerListener一个。我尝试将其设置为静态,但是由于它处理了滑块和FXML文件中的此类内容,因此无法将其设置为静态,因此无法正常工作。

我需要从类外部引用的控制器和FXML文件的简化版本如下:

public class MainAppController implements Initializable {

@FXML AnchorPane anchor;
@FXML AnchorPane window;
public static AnchorPane pane;
private boolean isPlay = false;
private boolean makeChanges = false;
public static MediaPlayer player;
PlayerUtils playerUtil = new PlayerUtils();
@FXML Slider volume, progressBar;
@FXML Label playTime, fullDuration;

String songFile;
Media songMedia;


Duration duration;
boolean updating = false;

//declaring the media player listener so that it can be removed and added
public InvalidationListener listener = new InvalidationListener()
        {
            public void invalidated(Observable ov) {
                //if changes to the slider are being made then values will not be updated
                //as it causes interference when trying to move the slider
                if(makeChanges == false){
                    updateValues();
                }

            }
        };

//this just plays or pauses depending
@FXML public void play_pause(){
    play_pauseFunction();
}

//updates values of current time display (playTime) and updates the slider value
//called from the listener so constantly updating
protected void updateValues() {
        //updates values of playTime and slider values
}

//THIS IS THE ONE I NEED TO ACCESS

//makes sure the player has no listeners before adding a new one
public void addPlayerListener(){
    player.currentTimeProperty().removeListener(listener);
    player.currentTimeProperty().addListener(listener);
}

@Override
public void initialize(URL url, ResourceBundle rb) {



}

}

很抱歉,这个问题问得不好,但我想不出另一种解决方法。

谢谢您的帮助

修订:我实际上想使用此方法:

public void play_pauseFunction(){
    if(isPlay == false){
        //temp while playlists not working
        if(player == null){
            songFile = "E:\\Project\\Whupsh\\Songs\\Whenever, wherever - Shakira.mp3";
            player = new MediaPlayer(PlayerUtils.getSongMedia(songFile));
            progressBar.setDisable(false);
            volume.setDisable(false);
            duration = player.getMedia().getDuration();
        }
        player.play();
        //adds listener to link with slider
        addPlayerListener();
        play_pause.getStyleClass().remove("play");
        play_pause.getStyleClass().add("pause");
        isPlay = true;
    }
    else{

        player.pause();
        play_pause.getStyleClass().remove("pause");
        play_pause.getStyleClass().add("play");
        isPlay = false;
    }
}

此方法与所有其他方法在同一类中

1 个答案:

答案 0 :(得分:-1)

一种有效的方法是让静态类包含所有需要从另一个控制器访问的控制器。

这不是一种特别好的处理方式,从外部访问控制器的更好方法是像kleopatra所说的那样将其作为参数传递。

Passing Parameters JavaFX FXML