2016-11-16 3 views
0

DirectoryChooser()メソッドで画像のディレクトリを選択するのにディレクトリ選択を使用していますが、ディレクトリを選択しようとするとURL例外が発生します。ディレクトリパスを使用して新しいタイプの "ファイル"オブジェクトを作成するときにURL /不正な引数の例外が無効になる

ImageView imgView = new ImageView(strImageList[ count ].getPath()); 

この^ 348は、スタックトレースで参照行目に対応するコードである

makeImageViewArr(folder.getAbsolutePath()); 

この^ directoryChooser

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$0(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$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.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.access$1500(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$handleMouseEvent$354(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 

相続人スタックトレースで参照104行目に対応するコードであります方法

//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 
+0

を:ちょうどファイルを受け入れるようにする方法を変更し、ファイルを直接渡します読者の方 – jthort

+0

@jthortはい!私のapolgies –

+0

@jthort私は、問題が来ていると信じている2つの方法は、抽出され、上に投稿されました –

答えて

2

あなたはImageViewコンストラクタに文字列としてファイルパスを渡している。

ImageView imgView = new ImageView(strImageList[ count ].getPath()); 

しかし、Stringを取っImageViewコンストラクタは、URLを期待しています。 documentation

指定されたURLからイメージがロードされた新しいImageViewオブジェクトを割り当てます。

ファイルパスはURLではなく、有効な形でURLとして構成されていないこともあります(たとえば、空白などの不正な文字が含まれている可能性があります)。代わりにパスを渡すの

だから、あなたがファイルから取得するURL渡す必要があります:さておき、あなたのDirectorChooser()(原文のまま)方法として

ImageView imgView = new ImageView(strImageList[ count ].getURI().toString()); 

をされますStringに選ばれたFileを変換し、 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; 
} 
関連する問題