使用目录路径创建新类型 "File" 对象时出现无效 URL/Illegal 参数异常
Invalid URL/Illegal Argument Exception when using directory path to create a new type "File" object
我在 DirectoryChooser() 方法中使用目录选择器 select 图像目录,但在尝试 select一个目录。
ImageView imgView = new ImageView( strImageList[ count ].getPath() );
这个^是stacktrace中引用的第348行对应的代码
makeImageViewArr(folder.getAbsolutePath());
这个^是stacktrace中引用的第104行对应的代码
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1118)
at javafx.scene.image.Image.<init>(Image.java:620)
at javafx.scene.image.ImageView.<init>(ImageView.java:166)
at ICGPixelReader.makeImageViewArr(ICGPixelReader.java:348)
at ICGPixelReader.DirectoryChooser(ICGPixelReader.java:104)
at ICGPixelReader.lambda$addElements1[=14=](ICGPixelReader.java:205)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access00(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent4(GlassViewEventHandler.java:416)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1110)
... 49 more
这是 directoryChooser 方法
//Handles when user presses button to open file chooser and select
//the folder of images
private void DirectoryChooser(){
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Open images folder");
folder = chooser.showDialog(window);
//Null directory check
if(folder == null){
System.out.println("Null directory");
}
//Else make the image array from that folder
else{
System.out.println(folder);
makeImageViewArr(folder.getAbsolutePath());
}
}
//END METHOD
此目录路径将用作另一个方法(makeImageViewArr(String folderName))方法的参数。
//Makes imageView arraylist from all images in a given directory
private ArrayList<ImageView> makeImageViewArr(String folderName) {
System.out.println(folderName);
//transer file names from directory folder to string array
File imagesDir = new File(folderName);
File[] strImageList = imagesDir.listFiles();
myMouseHandler mouseHandler = new myMouseHandler();
//instantiate imageview arraylist
arrImageList = new ArrayList<ImageView>();
//get files from folder & start at 1 to ignore ds.Store
for( int count = 1; count < strImageList.length; count++ ) {
ImageView imgView = new ImageView( strImageList[ count ].getPath() );
imgView.setOnMouseClicked( mouseHandler );
imgView.setFitHeight(500);
imgView.setFitWidth(500);
imgView.setPreserveRation(true);
arrImageList.add( imgView );
}
return arrImageList;
}//END METHOD
您正在将文件路径作为字符串传递给 ImageView
构造函数:
ImageView imgView = new ImageView( strImageList[ count ].getPath() );
然而,采用 String
的 ImageView
构造函数期望 URL。如 documentation 中所述:
Allocates a new ImageView object with image loaded from the specified URL.
文件路径不是 URL,并且通常甚至不是 URL 的有效格式(它可能包含非法字符,例如白色 space) .
因此,您不应传递路径,而应传递从文件中获取的 URL:
ImageView imgView = new ImageView( strImageList[ count ].getURI().toString() );
顺便说一句,您的 DirectorChooser()
(原文如此)方法将所选的 File
转换为 String
,然后您将其传递给 makeImageViewArr(...)
方法,在该方法中您立即从中创建一个 File
。这很奇怪(至少可以说)。改个接受文件的方法,直接传文件就可以了:
private void DirectoryChooser(){
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Open images folder");
folder = chooser.showDialog(window);
//Null directory check
if(folder == null){
System.out.println("Null directory");
}
//Else make the image array from that folder
else{
System.out.println(folder);
makeImageViewArr(folder);
}
}
和
private ArrayList<ImageView> makeImageViewArr(File imagesDir) {
File[] strImageList = imagesDir.listFiles();
myMouseHandler mouseHandler = new myMouseHandler();
//instantiate imageview arraylist
arrImageList = new ArrayList<ImageView>();
//get files from folder & start at 1 to ignore ds.Store
for( int count = 1; count < strImageList.length; count++ ) {
ImageView imgView = new ImageView( strImageList[ count ].toURI().toString() );
imgView.setOnMouseClicked( mouseHandler );
imgView.setFitHeight(500);
imgView.setFitWidth(500);
imgView.setPreserveRation(true);
arrImageList.add( imgView );
}
return arrImageList;
}
我在 DirectoryChooser() 方法中使用目录选择器 select 图像目录,但在尝试 select一个目录。
ImageView imgView = new ImageView( strImageList[ count ].getPath() );
这个^是stacktrace中引用的第348行对应的代码
makeImageViewArr(folder.getAbsolutePath());
这个^是stacktrace中引用的第104行对应的代码
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1118)
at javafx.scene.image.Image.<init>(Image.java:620)
at javafx.scene.image.ImageView.<init>(ImageView.java:166)
at ICGPixelReader.makeImageViewArr(ICGPixelReader.java:348)
at ICGPixelReader.DirectoryChooser(ICGPixelReader.java:104)
at ICGPixelReader.lambda$addElements1[=14=](ICGPixelReader.java:205)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access00(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent4(GlassViewEventHandler.java:416)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1110)
... 49 more
这是 directoryChooser 方法
//Handles when user presses button to open file chooser and select
//the folder of images
private void DirectoryChooser(){
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Open images folder");
folder = chooser.showDialog(window);
//Null directory check
if(folder == null){
System.out.println("Null directory");
}
//Else make the image array from that folder
else{
System.out.println(folder);
makeImageViewArr(folder.getAbsolutePath());
}
}
//END METHOD
此目录路径将用作另一个方法(makeImageViewArr(String folderName))方法的参数。
//Makes imageView arraylist from all images in a given directory
private ArrayList<ImageView> makeImageViewArr(String folderName) {
System.out.println(folderName);
//transer file names from directory folder to string array
File imagesDir = new File(folderName);
File[] strImageList = imagesDir.listFiles();
myMouseHandler mouseHandler = new myMouseHandler();
//instantiate imageview arraylist
arrImageList = new ArrayList<ImageView>();
//get files from folder & start at 1 to ignore ds.Store
for( int count = 1; count < strImageList.length; count++ ) {
ImageView imgView = new ImageView( strImageList[ count ].getPath() );
imgView.setOnMouseClicked( mouseHandler );
imgView.setFitHeight(500);
imgView.setFitWidth(500);
imgView.setPreserveRation(true);
arrImageList.add( imgView );
}
return arrImageList;
}//END METHOD
您正在将文件路径作为字符串传递给 ImageView
构造函数:
ImageView imgView = new ImageView( strImageList[ count ].getPath() );
然而,采用 String
的 ImageView
构造函数期望 URL。如 documentation 中所述:
Allocates a new ImageView object with image loaded from the specified URL.
文件路径不是 URL,并且通常甚至不是 URL 的有效格式(它可能包含非法字符,例如白色 space) .
因此,您不应传递路径,而应传递从文件中获取的 URL:
ImageView imgView = new ImageView( strImageList[ count ].getURI().toString() );
顺便说一句,您的 DirectorChooser()
(原文如此)方法将所选的 File
转换为 String
,然后您将其传递给 makeImageViewArr(...)
方法,在该方法中您立即从中创建一个 File
。这很奇怪(至少可以说)。改个接受文件的方法,直接传文件就可以了:
private void DirectoryChooser(){
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Open images folder");
folder = chooser.showDialog(window);
//Null directory check
if(folder == null){
System.out.println("Null directory");
}
//Else make the image array from that folder
else{
System.out.println(folder);
makeImageViewArr(folder);
}
}
和
private ArrayList<ImageView> makeImageViewArr(File imagesDir) {
File[] strImageList = imagesDir.listFiles();
myMouseHandler mouseHandler = new myMouseHandler();
//instantiate imageview arraylist
arrImageList = new ArrayList<ImageView>();
//get files from folder & start at 1 to ignore ds.Store
for( int count = 1; count < strImageList.length; count++ ) {
ImageView imgView = new ImageView( strImageList[ count ].toURI().toString() );
imgView.setOnMouseClicked( mouseHandler );
imgView.setFitHeight(500);
imgView.setFitWidth(500);
imgView.setPreserveRation(true);
arrImageList.add( imgView );
}
return arrImageList;
}