JavaFX FXML Controller初始化方法未被调用
我试图从一个简单的ArrayList的内容填充ListView。 这是我的
Controller.java文件:
package design; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import javafx.beans.property.ListProperty; import javafx.beans.property.SimpleListProperty; import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ListView; public class Controller { @FXML private Button buttontest; @FXML private ListView listViewofSongs; protected List songList = new ArrayList(); protected ListProperty listProperty = new SimpleListProperty(); Song Language = new Song("Peter", "myalbum", "yes", 2010); public void addSong(Song song){ songList.add(song); } public void initialize(URL url, ResourceBundle rb) { addSong(Language); listViewofSongs.setItems(FXCollections.observableList(songList)); } }
这是我的Style.fxml文件:
该程序运行,但我输入的歌曲没有出现在ListView中(并且Song类有一个toString方法)。
我能做什么?
问题在于,财务主任并未作为预期问题的提问者进行初始化。
在Java 8中FXMLLoader的操作有点奇怪。
-
如果在Controller中定义了无参数的
initialize()
方法并且没有实现Initializable
接口,那么FXML加载器仍将自动调用initialize方法。 -
相反,如果在Controller中定义参数化的
public void initialize(URL url, ResourceBundle rb)
方法,则FXML加载器不会自动调用initialize方法, 除非您的控制器也实现了Initializable
接口。
由于问题中的代码使用的是参数化初始化方法而不是实现Initializable,因此未进行初始化。
如果我看得正确,您实际上不使用initialize()
方法中的URL和ResourceBundle参数。 如果URL是fxml文件的路径,并且ResourceBundle包含GUI的internatonalization属性,那么您应该定义不带参数的initialize()
方法,但使用@FXML
注释。 应将URL和ResourceBundle传递给FXMLLoader。
喜欢
FXMLLoader loader = new FXMLLoader(URL, rb);
和
@FXML private void initialize() { ... }
这样就会自动调用initialize()
。
我需要在类中实现Initializable并在调用方法之前添加@Override。