【问题标题】:How can I load Computer Directory images in JAVAFX如何在 JAVAFX 中加载计算机目录图像
【发布时间】:2011-10-20 03:52:15
【问题描述】:

我正在尝试将我的计算机文件夹图像加载到缩略图墙上。我从另一个论坛读到on a thread ImageView "url" 实例变量不支持系统路径。我尝试了那里的解决方案,但它引发了异常:java.lang.OutOfMemoryError: Java heap space as it keeps reading the file

另一个问题是它一直在警告我使用包 javafx.ext -> SwingUtils.toFXImage 方法。

我也试过这样输入网址:

"file://localhost//Users/USER/Pictures/Camera/test/1.JPG"

我尝试显示多张图片,但总是只显示 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));
}

【问题讨论】:

    标签: image imageview javafx


    【解决方案1】:

    目前尚不清楚您要做什么。如果您谈论的是 JavaFX 2.0,则以下代码有效。如果您正在加载大量图像并且需要节省内存,则只需为一次要显示的数量创建足够的 ImageView。然后,当您翻阅图像时,您可以换出 ImageView 中包含的 Image 对象。

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

    【讨论】:

    • 如果我要在同一个dr 的文件夹中使用图像,我可以将./imags/img.png 作为值传递给新的File 吗?
    【解决方案2】:

    很简单:用浏览器打开一张图片,复制图片的整个 url 并将其粘贴为 Image 对象的参数。不要删除“文件///:”,因为这会使图像可加载。你会从那里得到你的其他逻辑。快乐的编码,例如

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

    【讨论】:

      【解决方案3】:

      以前的答案都不适合我。但是,我不久前看到但找不到原始链接的这个却完美无缺。

      @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 文件夹。

      【讨论】:

      • 这个一点都不清楚,你还没有解释文件夹上下文是什么或者它为什么存在以及它与放置代码的关系。
      【解决方案4】:

      抱歉,如果我的回答来晚了一点,但这是我的方法,无论您将文件放在哪里,它都 100% 有效 1.将您的图像分配给文件 2.将文件解析为URI 3.将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());
      

      如果有人知道更好的方法,请告诉我们!

      【讨论】:

        【解决方案5】:

        另一种解决方案是将 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();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-21
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多