我正在尝试从文件夹中提取arraylist
图标图像,但我一直收到NullPointerException。我已经可以提取较小的版本,但它们太小了。我想要的图标是常规尺寸的图标。 filePaths
包含图标位置列表。 iconBIG.add(...)
是NullPointerException
错误所指向的位置。
// Global
private ArrayList<Icon> iconBIG = new ArrayList<Icon>();
// Within extractIcon()...
for (String target : filePaths)
{
try
{
ShellFolder shell = ShellFolder.getShellFolder(new File(target));
iconBIG.add(new ImageIcon(shell.getIcon(true)));
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
编辑:我已获得使用ShellFolder的完全权限。
更新:如果我更改了<{p>} new File(target)
(仅包含应用程序的完整路径)
getShellFolder(new File(target)
到
getShellFolder(new File(C:/foo/bar.lnk)
,
代码有效。我已事先想过要用'/'替换所有\
,但我不明白为什么它仍然会调用相同的错误。
答案 0 :(得分:0)
似乎工作好了,因为你允许执行这个私有包。以下是适用于JDK 6的示例:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import javax.swing.*;
import sun.awt.shell.ShellFolder;
public class ShowShellIcon {
private static void createAndShowUI() {
final JFrame frame = new JFrame("Load Image");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton loadButton = new JButton("Display Image");
loadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser(
System.getProperty("user.home"));
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
try {
ShellFolder shell = ShellFolder.getShellFolder(fc
.getSelectedFile());
JOptionPane.showMessageDialog(null,
new ImageIcon(shell.getIcon(true)));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
}
});
frame.add(loadButton);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
createAndShowUI();
}
});
}
}