2011-10-20 98 views
6

我想將我的計算機文件夾圖像加載到thumnails牆上。我從以前的thread從另一個論壇讀取ImageView「url」實例可用不支持系統路徑。我嘗試瞭解決方案,但它會導致java.lang.OutOfMemoryError:Java堆空間,因爲它會一直讀取文件。我如何在JAVAFX中加載計算機目錄圖像

另一個問題是它不斷給我警告使用包javafx.ext ---> SwingUtils.toFXImage方法。

我也試圖輸入的URL是如下 URL:「的文件://localhost//Users/user/Pictures/Camera/test/1.JPG」 我試圖顯示中的圖像的20倍,只有當我運行我的應用程序時,它纔會顯示隨機3或4圖像。該圖像將顯示爲空盒子,創建它們來存儲它們

我檢查從ImageView給出的錯誤函數,它並不表示我的任何圖像遇到錯誤。

有沒有其他的選擇?

真的需要這方面的幫助。一直在嘗試幾天。

代碼

function load() { 
println("RUNTIME {Runtime.getRuntime().maxMemory()}"); 
System.gc(); 
Runtime.getRuntime().freeMemory(); 

//MAC Folder PATH 
var path: String = "/Users/username/Pictures/camera/test/1.JPG";; 
var file: File = new File(path); 
//http://download.oracle.com/docs/cd/E17802_01/javafx/javafx/1.3/docs/api/javafx.ext.swing/javafx.ext.swing.SwingUtils.html 
//public toFXImage(image: java.awt.image.BufferedImage) : Image 
//Creates a JavaFX Image from a BufferedImage. 
img = SwingUtils.toFXImage(ImageIO.read(file)); 
} 

回答

19

目前還不清楚到底是什麼你正在嘗試做的。如果您正在討論JavaFX 2.0,則以下代碼可用。如果您正在加載大量圖像並需要節省內存,則只需要爲想要一次顯示的數字創建足夠的ImageView。然後,當您翻閱圖像時,您可以更換ImageView中包含的對象。

public void start(Stage primaryStage) { 
    primaryStage.setTitle("Hello World"); 
    StackPane root = new StackPane(); 
    Scene scene = new Scene(root, 300, 250); 

    File file = new File("/System/Library/CoreServices/loginwindow.app/Contents/Resources/LogOut.png"); 
    Image image = new Image(file.toURI().toString()); 
    ImageView iv = new ImageView(image); 

    root.getChildren().add(iv); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

如果我要在同一'dr'的文件夾中使用圖像,我可以將'./images/img.png'作爲值傳遞給新的'File'嗎? –

1

另一種解決方案是將InputStream傳遞給Image類的構造函數;並正在努力...

public void start(Stage primaryStage) { 
    primaryStage.setTitle("Hello World"); 
    StackPane root = new StackPane(); 
    Scene scene = new Scene(root, 300, 250); 

    java.io.FileInputStream fis = new FileInputStream("/System/Library/CoreServices/loginwindow.app/Contents/Resources/LogOut.png"); 
    ImageView iv = new ImageView(new Image(fis)); 

    root.getChildren().add(iv); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
4

其簡單:打開一個圖像與瀏覽器複製PIC的整個URL,並將其粘貼爲Image對象的參數。請勿刪除「// //:」文件,因爲這會使圖像可加載。你會從那裏得到你的另一個邏輯。快樂編碼如

Image image = new Image("file:///C:/Users/Nigel/Desktop/my_image.png"); 
ImageView imgview = new ImageView(image); 
1

對不起,如果我的回答就有點晚了,但是這是我的方法和它的作品100%,無論你把你的文件 1.assign您的圖像文件 2.parse文件到URI 3.assign的uri.toString()將圖像

前代碼:

File imageFile = new File("path/to/image/outside/your/jar/awesomeless.jpg"); 
String fileLocation = imageFile.toURI().toString(); 
Image fxImage = new Image(fileLocation);  

,或者你可以簡單地把它放在一起這樣的:

Image fxImage = new Image(new File("path/.../awesomemore.jpg").toURI().toString()); 

如果有人知道更好的方法,請讓我們知道!

1

沒有以前的答案爲我工作。然而,這個我剛纔看到的但卻無法找到原始鏈接的工作完美無瑕。

@Override 
public void start(Stage primaryStage) throws Exception { 
    //create a pane to hold the image views 
    Pane pane = new HBox(10); 
    pane.setPadding(new Insets(5,5,5,5)); 

    //create the image to be used! 
    Image image = new Image("/Content/vortex.jpg"); 

    //set some custom properties and add an image 
    ImageView imageView = new ImageView(image); 
    imageView.setFitHeight(100); 
    imageView.setFitWidth(100); 
    pane.getChildren().add(imageView); 

    //add the second image view with this image and no custom properties 
    pane.getChildren().add(new ImageView(image)); 

    ImageView imageView2 = new ImageView(image); 
    imageView2.setRotate(45); 
    pane.getChildren().add(imageView2); 

    Scene scene = new Scene(pane, 200, 200); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

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

的關鍵是,當你創建圖像,啓動路徑以「/」(即:「/Content/vortex.jpg」)。請注意,在此設置中,根文件夾是大多數IDE中的src文件夾。