Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/JavaFX:为JavaFX标签设置Swing图标_Java_Javafx_Icons_Label - Fatal编程技术网

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

Java/JavaFX:为JavaFX标签设置Swing图标,java,javafx,icons,label,Java,Javafx,Icons,Label,我试图从文件(.ico/.exe)中读取缩略图(图标;32x32px),并将其设置为JavaFX标签 我的第一次尝试: public Icon getLargeIcon(String exeFile) { if (exeFile != null) { File file = new File(exeFile); try { ShellFolder sf = ShellFolder.getShellFolder(file);

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

我的第一次尝试:

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;
}
            URL url = file.toURI().toURL();
            Image image = new Image(url.toString());
            lblAppIconValue.setGraphic(new ImageView(image));
之后,我会这样做:

    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:loadPlatformImage不支持的类

我的第二次尝试:

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;
}
            URL url = file.toURI().toURL();
            Image image = new Image(url.toString());
            lblAppIconValue.setGraphic(new ImageView(image));
也不工作

我的问题:如何将javax.swing.Icon设置为JavaFX标签?可能吗?如果不可能,如何从文件中读取缩略图并将其设置为JavaFX标签的图标/图形


谢谢

如果要在JavaFX上的应用程序中放置图像,有两个主要选项:

  • 在fxml中定义它:

    <ImageView>
      <Image url="icon.png"/>
    </ImageView>
    
  • icon.png
    应与fxml文件或控制器放在同一个包中(否则,您应修改该示例中的图像名称)

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

    fxml:

    
    
    控制器:

    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));
    
         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
                             }
                         }
                     }
                 });
             }
         }
    
    public类MainController实现可初始化{
    公共父根;
    公共按钮设置图像按钮;
    公众形象;
    @凌驾
    公共void初始化(URL位置、ResourceBundle资源){
    setImageButton.setOnAction(新的EventHandler(){
    @凌驾
    公共无效句柄(ActionEvent事件){
    FileChooser FileChooser=newfilechooser();
    File File=fileChooser.showOpenDialog(root.getScene().getWindow());
    如果(文件!=null){
    试一试{
    BuffereImage BuffereImage=ImageIO.read(文件);
    Image picture=SwingFXUtils.toFXImage(bufferedImage,null);
    image.setImage(图片);
    }捕获(IOEX异常){
    //做点什么
    }
    }
    }
    });
    }
    }
    
    永远不要使用
    impl\u
    方法:这些方法不是公共API的一部分

    要将awt图像转换为FX图像,
    javafx.embed.swing
    中的
    SwingFXUtils
    类有一个
    toFXImage(…)
    方法,该方法将
    buffereImage
    转换为javafx
    图像。不清楚图标中的图像是否为
    buffereImage
    ,因此需要几个步骤来实现这一点:

    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
    构造函数。

    问题是,图标应该是动态变化的,因为用户可以选择一个exe文件,例如“C:\Program Files(x86)\Google\Chrome\Application\Chrome.exe”,谢谢,但它仍然不起作用,我总是在第行得到一个NullPointerException“BuffereImage=ImageIO.read(文件);“(文件不为null!)我在那一行上出错:graphics.drawImage(0,0,awtImage);“类型graphics中的drawImage(Image,int,int,ImageObserver)方法不适用于参数(int,int,Image)“哦,对不起,参数记错了。我现在修复了它。我不确定使用
    sun.awt.shell.ShellFolder
    的人是否关心
    impl\uz
    方法是否不是JavaFX公共API的一部分。毕竟,双方都会使用非标准API。顺便说一句,如果
    图像
    不是
    缓冲图像
    ,您将
    绘图图像
    观察者一起使用,并忽略其返回值,则无法保证
    图像
    是完整的(或者如果已经绘制了任何内容)…@Holger OP没有显示导入,所以我不知道什么是
    ShellFolder
    ;你的观点都很好。