Java/JavaFX:为JavaFX标签设置Swing图标
我试图从文件(.ico/.exe)中读取缩略图(图标;32x32px),并将其设置为JavaFX标签 我的第一次尝试: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);
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上的应用程序中放置图像,有两个主要选项:
<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
;你的观点都很好。