Javafx не может загрузить новое добавленное изображение - PullRequest
0 голосов
/ 21 июня 2019

Это мой код:

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>

и структура файла: enter image description here

Когда я запускаю свой проект и набираю 1 в текстовом поле и нажимаю кнопку, он показывает картинку. Теперь, не закрывая программу, я добавляю 2.png файл в папку res. И введите 2 в текстовом поле. после нажатия кнопки появляется сообщение «java.lang.IllegalArgumentException: недействительный URL-адрес: недействительный URL-адрес или ресурс не найден» и не удается загрузить изображение. Но если я завершу программу и перезапущу ее, наберу 2 и нажми кнопку отлично.

1 Ответ

1 голос
/ 21 июня 2019

Это работает для меня.

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

Тогда вы сможете загрузить новое изображение, если ваш путь верен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...