如何在JavaFX中获取TableView的文件图标?

时间:2017-10-27 15:19:01

标签: java javafx

我有TableView列出给定文件夹中的文件。在TableView中,我有一个列,其中包含一个按钮,可在单击时打开该文件。

我正在尝试将文件的文件类型图标显示为该按钮的图形。例如,.xlsx文件将显示Microsoft Excel图标,.pdf文件显示Adobe PDF图标。

根据我的研究,我了解JavaFX没有本地方式来获取文件的关联图标,因此我需要进行一些严格的Swing转换。

但是,我无法在CellFactory内找出如何做到这一点。

这是我到目前为止的部分代码,我需要添加代码来获取文件的图标:

colOpenFile.setCellFactory(col -> {
    final javafx.scene.control.Button btnOpen = new Button();
    final ImageView openIcon;

    TableCell<FileResource, FileResource> cell = new TableCell<FileResource, FileResource>() {

        @Override
        protected void updateItem(FileResource item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setGraphic(null);
                setText(null);
            } else {
                Icon icon = FileSystemView.getFileSystemView().getSystemIcon(new File(cell.getItem().getFilename()));
                setAlignment(Pos.CENTER);
                openIcon = fetchFileIcon(item.getFilename());                   
                openIcon.setFitWidth(16);
                openIcon.setFitHeight(16);
                btnOpen.setGraphic(openIcon);
                setGraphic(btnOpen);
            }
        }
    };
}

我还没有完成尝试此实现,因为我已经知道这会引发Exception,因为cell可能尚未初始化。

如何获取该行上显示的FileResource的文件图标,并将其分配给同一行中的Button

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,您可以使用JFileChooser实例获取Swing图标。然后,根据这个问题,Java/JavaFX: Set Swing Icon for JavaFX label,您可以使用SwingFXUtils来获取JavaFX图像。

所以你可以这样做:

JFileChooser fileChooser = new JFileChooser();
File file = new File(cell.getItem().getFilename());
ImageIcon icon = (ImageIcon) fileChooser.getIcon(file);
BufferedImage image = (BufferedImage) icon.getImage();
Image fxIcon = SwingFXUtils.toFXImage(image, null);

编辑: 找到了另一种获取图标的方法:How do I get a file's icon in Java? @camickr建议使用FileSystemView来获取Icon这样的内容:

Icon icon = FileSystemView.getFileSystemView().getSystemIcon( file );

这可能是一个更好的解决方案,因为正如@James_D指出的那样,你不应该在AWT事件线程之外创建Swing组件,而且这个FileSystemView方法是静态的。