无法从另一个控制器访问控制器及其方法
Can't access controller and its methods from another controller
我不是 100% 确定如何最好地描述这个问题,但我会尽力而为。
我正在开发一个音乐应用程序并且在一个应用程序中有不同的 windows 并且已经将窗格加载到应用程序 window 中的一个小窗口中,如下所示:
从绿色按钮变为播放列表屏幕的位是 window,其中加载了 FXML 文件。
我最近创建了应用程序的一部分,它可以通过这个小 window 应用程序中的按钮播放歌曲,但媒体播放器位于主应用程序控制器中,需要在此处更新值底部的两个滑块。
我看到了一些关于引用我用于主应用程序的控制器的确切实例的信息,但我不确定如何执行此操作。我试图创建 mainAppController 的静态版本,但这是一个单独的实例,因此没有正确引用。
我需要参考的唯一方法是 addPlayerListener 方法。我试图将其设置为静态,但由于它处理无法设置为静态的 FXML 文件中的滑块等,因此无法正常工作。
我需要从 class 外部引用的控制器和 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;
}
}
此方法与所有其他方法class相同
一种可行的方法是让静态 class 保存所有需要从另一个控制器访问的控制器。
这不是一种特别好的做事方式,从另一个外部访问控制器的更好方式是将其作为参数传递,正如 kleopatra 所说。
Passing Parameters JavaFX FXML
我不是 100% 确定如何最好地描述这个问题,但我会尽力而为。
我正在开发一个音乐应用程序并且在一个应用程序中有不同的 windows 并且已经将窗格加载到应用程序 window 中的一个小窗口中,如下所示:
从绿色按钮变为播放列表屏幕的位是 window,其中加载了 FXML 文件。
我最近创建了应用程序的一部分,它可以通过这个小 window 应用程序中的按钮播放歌曲,但媒体播放器位于主应用程序控制器中,需要在此处更新值底部的两个滑块。
我看到了一些关于引用我用于主应用程序的控制器的确切实例的信息,但我不确定如何执行此操作。我试图创建 mainAppController 的静态版本,但这是一个单独的实例,因此没有正确引用。
我需要参考的唯一方法是 addPlayerListener 方法。我试图将其设置为静态,但由于它处理无法设置为静态的 FXML 文件中的滑块等,因此无法正常工作。
我需要从 class 外部引用的控制器和 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;
}
}
此方法与所有其他方法class相同
一种可行的方法是让静态 class 保存所有需要从另一个控制器访问的控制器。
这不是一种特别好的做事方式,从另一个外部访问控制器的更好方式是将其作为参数传递,正如 kleopatra 所说。
Passing Parameters JavaFX FXML