如何在按钮单击时打开TilePane中列出的图像

时间:2014-05-23 08:34:01

标签: java javafx

我有一个TilePane,列出了我硬盘上不同目录的图像。我想,当点击TilePane上的图像时:

  1. 要打开包含图像的文件夹,
  2. 要打开图像,例如,使用默认程序设置打开该类型的图像文件。
  3. 到目前为止,我点击图片时只给了ImageResources/faviicon.png这样的内容。

    我有什么方法可以使用,例如ImageResources/faviicon.png来做1.和2.上面?谢谢大家。

    这是我所拥有的课程:

    public class TilePaneExample extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            VBox root = new VBox(30);
    
            String[] imageResources = new String[]{
                //loading images
                "ImageResources/facebook.png",
                "ImageResources/faviicon.png",
                "ImageResources/jquery-logo.png",
                "ImageResources/linkedin_32.png",
                "ImageResources/loading1.png",
                "ImageResources/twitter.png",
                "ImageResources/twitter_32.png",
                "ImageResources/wp.png",};
    
            VBox vb = new VBox(20);
            Text text4Tile = new Text("Images in TilePane");
            text4Tile.setFont(Font.font("Calibri", FontWeight.BOLD, 30));
            text4Tile.setUnderline(true);
            VBox.setMargin(text4Tile, new Insets(10, 0, 0, 10));
    
            //creating Flow Pane
            TilePane tilePane = new TilePane();
            tilePane.setHgap(5);
            tilePane.setVgap(5);
    
            for (final String imageResource : imageResources) {
                Image image = new Image(getClass().getResourceAsStream(imageResource));
                ImageView imageView = new ImageView(image);
                imageView.setOnMouseClicked(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        System.out.println("You clicked: " + imageResource);
                    }
                });
                tilePane.getChildren().add(imageView);
            }
    
            vb.getChildren().addAll(text4Tile, tilePane);
    
            root.getChildren().addAll(vb);
            primaryStage.setTitle("TilePane Example");
            Scene scene = new Scene(root, 300, 150);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    更新

    根据 DarkDarker 建议,我这样做了:

    imageView.setOnMouseClicked(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        try {
                            System.out.println("You clicked: " + imageResource);
    
                            File f = new File(imageResource);
                            System.out.println(f.getAbsolutePath());
    
                            Desktop.getDesktop().open(f.getParentFile());
                        } catch (IOException ex) {
                            Logger.getLogger(TilePaneExample.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                });
    
    但是,我得到了这个错误:

    java.lang.IllegalArgumentException: The file: ImageResources doesn't exist.
        at java.awt.Desktop.checkFileValidation(Desktop.java:209)
        at java.awt.Desktop.open(Desktop.java:270)
    

1 个答案:

答案 0 :(得分:0)

for (final String imageResource : imageResources) {
    String imagePath = getClass().getResource(imageResource).toExternalForm();
    ImageView imageView = new ImageView(new Image(imagePath));

    imageView.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println("You clicked: " + imagePath);
            File imageFile = new File(imagePath);
            Desktop.getDesktop().open(imageFile.getParentFile()); // open a folder in explorer 
            Desktop.getDesktop().open(imageFile); // open file with system preferred program
        }
    });
    tilePane.getChildren().add(imageView);
}