Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX ImageView未更新_Image_File_Javafx_Imageview_File Browser - Fatal编程技术网

JavaFX 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

因此,我尝试将图像加载并保存到imageView中,通过文件浏览器选择图像的位置。我已经做了好几天了,如果我不能把它修好,我会中风的。我已经尝试了我能想到的一切。事先谢谢你的帮助

已更新

这是我的主要课程:

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();