【问题标题】:How to get file icon for TableView in JavaFX?如何在 JavaFX 中获取 TableView 的文件图标?
【发布时间】:2017-10-27 15:19:01
【问题描述】:

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

我试图让文件的文件类型图标显示为该按钮的图形。例如,.xlsx 文件将显示 Microsoft Excel 图标,.pdf 文件将显示 Adob​​e 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

谢谢!

【问题讨论】:

  • “由于cell 可能尚未初始化而引发异常”是什么意思?什么例外?在初始化之前,您指的是哪里的单元格?
  • @James_D Icon icon = FileSystemView.getFileSystemView().getSystemIcon(new File(cell.getItem().getFilename()));updateItem 方法中。
  • 那么例外是什么?什么时候发生?
  • 对不起,这是编译器错误,不是异常。 Error:(392, 103) java: variable cell might not have been initialized

标签: java javafx


【解决方案1】:

好吧,您可以使用 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 方法是静态的。

【讨论】:

  • 您不应在 AWT 事件调度线程以外的任何线程上创建JFileChooser;这可能不会在 JavaFX 应用程序中自然发生。你可能应该展示你是如何处理这个问题的(这有点不重要)。
  • @James_D 好点,如果我有时间,我可能会在稍后将其添加到我的答案中。
  • 我发现了很多实际获取图标的方法;我更大的问题是能够将它分配给按钮的图形。 TableView 列出了文件对象,我需要从该对象获取文件名才能获取文件的图标。但是,我无法从CellFactory 中弄清楚如何做到这一点。
  • new File(cell.getItem().getFilename()) 不起作用?
  • @MMAdams 我在尝试引用 cell 时收到此编译器错误:“错误:(392, 103) java:变量单元格可能尚未初始化”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多