我有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
?
谢谢!
答案 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方法是静态的。