【问题标题】:Javafx can't load new added imageJavafx 无法加载新添加的图像
【发布时间】:2019-11-04 07:03:23
【问题描述】:

这是我的代码:

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 并单击按钮就可以了。

【问题讨论】:

  • 您需要出示您的代码,以便我们在这里为您提供帮助。请查看如何创建 minimal reproducible example 然后 edit 您的问题以包含它。
  • @Zephyr 我完全改变了这个问题,所以它现在以一般的方式反映了我的问题。
  • 您的代码仍然可能存在问题,我们需要查看该问题才能重现问题。你目前描述的应该是不可能的。
  • @Zephyr 我现在尝试编写一个完全独立的代码,我很快就会在这里添加。
  • 你的网址不应该是一个网址吗?

标签: java image javafx


【解决方案1】:

这对我有用。

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

如果路径正确,您应该能够加载新图像。

【讨论】:

  • 我完全改变了问题主体以清楚地反映我的问题并添加了一些代码。
  • @amirna String address = "./res/"+name+".png"; 不是 URL,正如您的例外所声称的那样。看看我是如何形成一个 url 的,如果是文件,file:// 然后是路径。
  • 为什么它一开始就有效呢?因为如果我不添加任何东西,它工作正常!无论如何,如果我真的需要添加完整的绝对路径,如何将这个相对地址转换为 url?因为实际上它必须适用于很多系统,而不仅仅是我的系统。
  • @amirna 它不在源目录中运行。当您在 intellij 中编译和运行时,它会复制资源。如果你签入你的 out 文件夹,它可能会复制资源。
  • @amirna 我已经更新了帖子。本质上,您不想将文件添加到您的资源中。将 ./res/image.png 设为文件 url 并加载图像。我在示例中添加了一些描述。
猜你喜欢
  • 2019-05-25
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2017-01-16
  • 1970-01-01
相关资源
最近更新 更多