2011-10-20 40 views
6

Tôi đang cố gắng tải hình ảnh thư mục máy tính của mình vào một bức tường thứ tư. Tôi đọc từ thread trước đó từ một diễn đàn khác mà ImageView "url" thể hiện biến thể không hỗ trợ đường dẫn hệ thống. Tôi đã thử với các giải pháp ở đó, nhưng nó sẽ gây ra một java.lang.OutOfMemoryError: Java heap không gian vì nó tiếp tục đọc các tập tin.Làm thế nào tôi có thể tải hình ảnh Thư mục Máy tính trong JAVAFX

một vấn đề khác là nó giữ cho tôi cảnh báo về việc sử dụng gói javafx.ext ---> phương thức SwingUtils.toFXImage.

Tôi cũng đã cố gắng nhập URL như dưới đây url: "tệp: //localhost//Users/user/Pictures/Camera/test/1.JPG" tôi đã thử hiển thị 20 lần hình ảnh , nó chỉ hiển thị một hình ảnh ngẫu nhiên 3 hoặc 4 chỉ khi tôi chạy ứng dụng của tôi. Hình ảnh sẽ hiển thị là các ô trống tạo để lưu trữ chúng

tôi kiểm tra với chức năng lỗi được cung cấp từ ImageView, nó không cho biết bất kỳ hình ảnh nào của tôi gặp lỗi.

Có lựa chọn thay thế nào khác không?

thực sự cần trợ giúp về vấn đề này. đã cố gắng trong nhiều ngày.

Codes

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

Trả lời

19

Hiện chưa rõ chính xác những gì bạn đang cố gắng làm. Nếu bạn đang nói về JavaFX 2.0, mã sau hoạt động. Nếu bạn đang tải rất nhiều hình ảnh và cần phải bảo tồn bộ nhớ, bạn chỉ phải tạo đủ ImageView cho số bạn muốn hiển thị cùng một lúc. Sau đó, khi bạn lật qua các hình ảnh, bạn có thể hoán đổi đối tượng Hình ảnh có trong 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

Nếu tôi đang sử dụng hình ảnh trong một thư mục trong cùng một 'dr', tôi có thể chuyển'./Imags/img.png' làm giá trị cho 'Tệp 'mới không? –

1

Một giải pháp khác là chuyển InputStream vào trình tạo lớp hình ảnh; và đang làm việc ...

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

của nó đơn giản: mở một hình ảnh với một trình duyệt và sao chép toàn bộ url của pic và dán nó như một tham số của đối tượng ảnh. KHÔNG XÓA "file ///:" vì điều này làm cho hình ảnh có thể tải được. bạn sẽ nhận được logic khác của bạn từ đó. hạnh phúc ví dụ như mã hóa

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

xin lỗi nếu câu trả lời của tôi đến một chút muộn nhưng đó là cách tiếp cận của tôi và nó hoạt động 100% bất cứ nơi nào bạn đang đặt tập tin của bạn 1.assign hình ảnh của bạn vào File 2.parse File để URI 3.assign các uri.toString() để hình ảnh

đang ví dụ:

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

hoặc bạn chỉ có thể đặt nó tất cả cùng nhau như thế này:

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

và vui lòng nếu có ai biết cách tiếp cận tốt hơn cho chúng tôi biết!

1

Không có câu trả lời nào trước đây phù hợp với tôi. Tuy nhiên, cái này, mà tôi đã thấy một lúc trước nhưng không thể tìm thấy một liên kết gốc từ, hoạt động hoàn hảo.

@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); 
} 

Điều quan trọng là khi bạn tạo hình ảnh, BẮT ĐẦU đường dẫn bằng '/' (nghĩa là: "/Content/vortex.jpg"). Lưu ý rằng trong thiết lập này, thư mục gốc là thư mục src trong hầu hết các IDE.

Các vấn đề liên quan