JavaFX ImageView未更新
因此,我尝试将图像加载并保存到imageView中,通过文件浏览器选择图像的位置。我已经做了好几天了,如果我不能把它修好,我会中风的。我已经尝试了我能想到的一切。事先谢谢你的帮助 已更新: 这是我的主要课程:JavaFX ImageView未更新,image,file,javafx,imageview,file-browser,Image,File,Javafx,Imageview,File Browser,因此,我尝试将图像加载并保存到imageView中,通过文件浏览器选择图像的位置。我已经做了好几天了,如果我不能把它修好,我会中风的。我已经尝试了我能想到的一切。事先谢谢你的帮助 已更新: 这是我的主要课程: public class Main extends Application { private Stage primaryStage; private BorderPane rootLayout; public Main(){} @Override
public class Main extends Application {
private Stage primaryStage;
private BorderPane rootLayout;
public Main(){}
@Override
public void start(Stage primaryStage) throws Exception{
this.primaryStage = primaryStage;
this.primaryStage.setTitle("Help Please");
initRootLayout();
showScreen();
}
public void initRootLayout(){
try{
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("view/RootLayout.fxml"));
rootLayout = (BorderPane) loader.load();
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
RootLayout controller = loader.getController();
controller.setMain(this);
primaryStage.show();
}catch(Exception e ){e.printStackTrace();}
}
public void showScreen(){
try{FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("view/sample.fxml"));
BorderPane sample = (BorderPane)loader.load();
rootLayout.setCenter(sample);
Controller controller = loader.getController();
controller.setMain(this);
}catch (Exception e){e.printStackTrace();}
}
public Stage getPrimaryStage(){return primaryStage;}
public static void main(String[] args) {
launch(args);
}
}
以下是rootLayout:
public class RootLayout {
private Main main;
private Controller controller = new Controller();
public void setMain(Main main){this.main = main;}
@FXML
private void handleOpen(){
FileChooser fileChooser = new FileChooser();
FileChooser.ExtensionFilter extensionFilter = new FileChooser.ExtensionFilter(
"PNG files (*.png)","*png");
fileChooser.getExtensionFilters().add(extensionFilter);
File file = fileChooser.showOpenDialog(main.getPrimaryStage());
if(file!= null){
controller.updateImage(file.toURI().toString());
}
}
}
这是控制器:
public class Controller implements Initializable {
@FXML
ImageView imageView = new ImageView();
String imageURL;
Main main = new Main();
public void setMain(Main main){
this.main = main;
}
public void updateImage(String url){
if(url.length()>=1){
Image image = new Image(url);
imageView.setImage(image);
System.out.println(url);
}
else{
System.out.println(url);
System.out.println("image invalid");
}
}
@Override
public void initialize(URL location, ResourceBundle resources) {
}
}
两件事:
fxmloader
注入(例如@FXML
字段)。这样做充其量是浪费资源,最坏的情况是引入微妙的bug。例如,如果未初始化imageView
字段,则会出现NullPointerException
,这表明您的设置存在问题。但是,由于您确实初始化了该字段,因此不会出现任何错误,并且会对代码的工作产生错误的印象RootLayout
controller类中,您有:
刚刚创建的Controller
实例未链接到任何FXML文件。由于您初始化了imageView
字段(请参见第一点),您最终会更新一个没有显示在任何地方的imageView
;在这里,如果不初始化所述字段,就会很好地表明存在问题。解决方案是将由fxmloader
创建的Controller
实例传递给另一个fxmloader
创建的RootLayout
实例
此外,在同一类中,您有:
这也是不必要的,因为创建的Main
实例不是正确的实例,并且几乎立即被对#setMain(Main)
的调用所取代假设您的FXML文件(您没有提供)是正确的,Java类应该更像: Main.java
public类主扩展应用程序{
私人阶段初级阶段;
私有边界布局;
专用根布局根布局控制器;
公共Main(){}
@凌驾
public void start(Stage primaryStage)引发异常{
this.primaryStage=primaryStage;
this.primaryStage.setTitle(“请帮助”);
initRootLayout();
showScreen();
}
public void initRootLayout(){
试一试{
FXMLLoader=新的FXMLLoader();
setLocation(Main.class.getResource(“view/RootLayout.fxml”);
rootLayout=(BorderPane)loader.load();
场景=新场景(根布局);
初级阶段。场景(场景);
//将RootLayout实例存储在字段so#showScreen()中
//我可以参考一下吗
rootLayoutController=loader.getController();
rootLayoutController.setMain(this);
primaryStage.show();
}捕获(例外e){
e、 printStackTrace();
}
}
公共屏幕{
试一试{
FXMLLoader=新的FXMLLoader();
setLocation(Main.class.getResource(“view/sample.fxml”);
BorderPane示例=(BorderPane)loader.load();
rootLayout.setCenter(示例);
Controller=loader.getController();
控制器setMain(this);
//在RootLayout实例上设置控制器实例
rootLayoutController.setController(控制器);
}捕获(例外e){
e、 printStackTrace();
}
}
公共阶段getPrimaryStage(){
返回初级阶段;
}
公共静态void main(字符串[]args){
发射(args);
}
}
RootLayout.java
公共类RootLayout{
私人主楼;
专用控制器;
公共无效设置主(主){
this.main=main;
}
公共无效设置控制器(控制器){
this.controller=控制器;
}
@FXML
私有无效handleOpen(){
FileChooser FileChooser=newfilechooser();
//注意:扩展名应以“*”作为前缀
FileChooser.ExtensionFilter ExtensionFilter=
新建FileChooser.ExtensionFilter(“PNG文件(*.PNG)”,“*.PNG”);
fileChooser.getExtensionFilters().add(extensionFilter);
File File=fileChooser.showOpenDialog(main.getPrimaryStage());
如果(文件!=null){
controller.updateImage(文件.toURI().toString());
}
}
}
Controller.java
公共类控制器实现可初始化{
@FXML ImageView ImageView;//保持未初始化状态,将被注入
字符串imageURL;
主要的;
公共无效设置主(主){
this.main=main;
}
公共void updateImage(字符串url){
如果(url.length()>=1){
图像=新图像(url);
设置图像(图像);
System.out.println(url);
}否则{
System.out.println(url);
System.out.println(“图像无效”);
}
}
@凌驾
公共void初始化(URL位置,ResourceBundle资源){}
}
注意:没有测试新代码。您正在为imageView使用@FXML标记,这意味着您不必创建新的imageView。这里只是一个提示,很好地解释了为什么会出现这种情况。您是如何加载fxml的?如果第一个代码片段确实来自您的控制器,那么将
null
传递给updateImage
方法的事实应该会导致NullPointerException
位于If(url.length()请您创建一个演示问题的示例,然后通过添加到您的问题中。该示例应该是最小的,但完整的,这意味着我们应该能够将代码复制到我们的机器上,并执行它,而不做任何修改。@Slaw我现在已将其更新为最小的可复制示例。如果可以,请帮助我。thanks@Robert感谢您的回复。我已经删除了不必要的创建新ImageView的操作。这并没有改变问题。如果您还有任何帮助,那将是非常好的。谢谢您的回复
private Controller controller = new Controller();
Main main = new Main();