Java/JavaFX。为JavaFX标签设置Swing图标

 2023-02-16    389  

问题描述

我正在尝试从文件(.ico/.exe)中读取缩略图(图标; 32x32px)并将其设置为Javafx标签.

我的第一次尝试:

Java/JavaFX。为JavaFX标签设置Swing图标

public Icon getLargeIcon(String exeFile) {
    if (exeFile != null) {
        File file = new File(exeFile);
        try {
            ShellFolder sf = ShellFolder.getShellFolder(file);
            return new ImageIcon(sf.getIcon(true), sf.getFolderType());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    return null;
}

之后,我正在这样做:

Icon largeIcon = getLargeIcon(file.getAbsolutePath());
    ImageIcon swingImageIcon = (ImageIcon) largeIcon;
    java.awt.Image awtImage = swingImageIcon.getImage();
    Image fxImage = javafx.scene.image.Image.impl_fromPlatformImage(awtImage);
    lblAppIconValue.setGraphic(new ImageView(fxImage));

我已经搜索了多个站点并找到了这个网站,但是它给了我一个例外:
java.lang.UnsupportedOperationException: unsupported class for loadPlatformImage

我的第二次尝试:

URL url = file.toURI().toURL();
            Image image = new Image(url.toString());
            lblAppIconValue.setGraphic(new ImageView(image));

也不工作…

我的问题:如何将Javax.swing.icon设置为Javafx标签?是否可以?如果不可能,如何从文件中读取缩略图并将其设置为Javafx标签的图标/图形?

谢谢!

推荐答案

永远不要使用impl_方法:这些不是公共API的一部分.

要将AWT图像转换为FX图像,javafx.embed.swing中的SwingFXUtils类具有toFXImage(…)的方法,将A BufferedImage转换为Javafx Image.目前尚不清楚您从图标中拥有的图像是否为BufferedImage,因此您需要几个步骤来进行工作:

BufferedImage bImg ;
if (awtImage instanceof BufferedImage) {
    bImg = (BufferedImage) awtImage ;
} else {
    bImg = new BufferedImage(awtImage.getWidth(null), awtImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    Graphics2D graphics = bImg.createGraphics();
    graphics.drawImage(awtImage, 0, 0, null);
    graphics.dispose();
}
Image fxImage = SwingFXUtils.toFXImage(bImg, null);

这是一种相当低效的方法,因为您首先从文件中创建一个awt映像,然后将其转换为FX图像,可能是通过中间缓冲映像.如果您可以访问ShellFolder类的源代码,则可能会看到如何实现getIcon()方法并遵循相同的过程.在某个时候,它必须获得带有图像数据的InputStream.一旦有了可以将其传递给javafx.scene.image.Image构造函数.

其他推荐答案

如果要在Javafx上放置图像,则有2个主要选项:

  1. 在FXML中定义它:

    <ImageView>
      <Image url="icon.png"/>
    </ImageView>
  2. 在您的控制器中创建Label:

    import javafx.scene.control.Label;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    
    ...
    
    Image image = new Image(getClass().getResourceAsStream("icon.png"));
    Label label = new Label("Label");
    label.setGraphic(new ImageView(image));

icon.png应与fxml-file或您的控制器放置在同一软件包中(否则您应该在该示例中修改图像名称).

更新:动态更改标签中的图像(根据用户选择的图像).

fxml:

<Button fx:id="setImageButton"/>
    <ImageView fx:id="image">
        <Image url="defaultImage.png"/>
    </ImageView>

控制器:

public class MainController implements Initializable {
         public Parent root;
         public Button setImageButton;
         public ImageView image;

         @Override
         public void initialize(URL location, ResourceBundle resources) {

             setImageButton.setOnAction(new EventHandler<ActionEvent>() {
                 @Override
                 public void handle(ActionEvent event) {
                     FileChooser fileChooser = new FileChooser();
                     File file = fileChooser.showOpenDialog(root.getScene().getWindow());
                     if (file != null) {
                         try {
                             BufferedImage bufferedImage = ImageIO.read(file);
                             Image picture = SwingFXUtils.toFXImage(bufferedImage, null);
                             image.setImage(picture);
                         } catch (IOException ex) {
                             // do something
                         }
                     }
                 }
             });
         }
     }

以上所述是小编给大家介绍的Java/JavaFX。为JavaFX标签设置Swing图标,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33910.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。