Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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可以';t加载新添加的图像_Java_Image_Javafx - Fatal编程技术网

Javafx可以';t加载新添加的图像

Javafx可以';t加载新添加的图像,java,image,javafx,Java,Image,Javafx,这是我的代码: Controller.java package sample import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; public class Controller { @FXML

这是我的代码:

Controller.java

package sample

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;


public class Controller {
    @FXML
    Button button;
    @FXML
    TextField text;

    @FXML
    ImageView iv;

    public void handleBtn()
    {
        String name = text.getText();
        String address = "./res/"+name+".png";
        Image image = new Image(address);
        iv.setImage(image);
    }

}
Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
和sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane prefHeight="387.0" prefWidth="481.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.171" fx:controller="sample.Controller">
   <children>
      <TextField fx:id="text" layoutX="41.0" layoutY="64.0" />
      <Button fx:id="button" layoutX="64.0" layoutY="169.0" mnemonicParsing="false" onAction="#handleBtn" text="Button" />
      <ImageView fx:id="iv" fitHeight="261.0" fitWidth="209.0" layoutX="222.0" layoutY="56.0" pickOnBounds="true" preserveRatio="true" />
   </children>
</AnchorPane>

当我运行我的项目并在文本字段中键入1并单击按钮时,它会显示图片。现在,在不关闭程序的情况下,我将一个2.png文件添加到res文件夹中。并在文本字段中键入2。单击按钮后,它会显示“java.lang.IllegalArgumentException:无效URL:无效URL或未找到资源”,并且无法加载图像。但如果我终止程序并重新运行它,键入2并单击按钮就可以了。

这对我来说很有效

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class FxTemp extends Application {

    public static void main(String[] args){
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Image image = new Image("file:///home/username/Desktop/test.png");
        primaryStage.setTitle("animated");
        ImageView imageView = new ImageView(image);
        imageView.addEventHandler(MouseEvent.MOUSE_CLICKED, evt->{
            System.out.println("click");
            Image imager = new Image("file:///home/username/Desktop/test.png");
            imageView.setImage(imager);
        });
        StackPane root = new StackPane();
        root.getChildren().add(imageView);
        primaryStage.setScene(new Scene(root, 512, 512));
        primaryStage.show();
    }
}
如果我更改test.png并单击视图,我会看到新图像

您实际上不应该将文件添加到“资源”中,这些是您在执行之前提供的文件。Intellij将文件复制到某个位置,并在类路径上使用该位置。然后您可以通过
getResource
访问它们

如果要将文件添加到一个文件夹中,然后要访问这些文件,可以执行以下操作

String nextImage = new File("./res/image.png").toURI().toString();

然后,只要路径正确,您就可以加载新图像。

您需要显示您的代码,以便我们能够在此为您提供帮助。请查看如何创建,然后查看您的问题以将其包括在内。@Zephyr我完全更改了该问题,因此现在它以一般方式反映了我的问题。您的代码仍然可能存在问题,我们需要查看该问题以重现该问题。您当前描述的内容应该是不可能的。@Zephyr我现在尝试编写一个完全独立的代码,我很快会在这里添加。您的url不应该是一个url吗?我完全更改了问题正文以清楚地反映我的问题,并添加了一些代码。@amirna
String address=“./res/”+name+“.png”
不是URL,正如您的异常所声称的那样。看看我是如何形成一个url的,如果它是一个文件,
file://
然后是路径。为什么它首先工作?因为如果我不添加任何内容,它就可以正常工作!。无论如何,如果我真的需要添加完整的绝对路径,如何将这个相对地址转换为url?因为实际上它必须在很多系统上工作,而不仅仅是我的系统。@amirna它不在源目录中运行。当您在intellij中编译和运行时,它会复制资源。如果你签入你的out文件夹,它可能会将资源复制到上面。@amirna我已经更新了帖子。基本上,您不希望将文件添加到资源中。将./res/image.png设为文件url并加载图像。我在示例中添加了一些描述。