2023-02-16 389
我正在尝试从文件(.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;
}
之后,我正在这样做:
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个主要选项:
在FXML中定义它:
<ImageView>
<Image url="icon.png"/>
</ImageView>
在您的控制器中创建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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态