我必须在点击JMenuItem时打开pdf。如果我从netbeans运行我的程序,我可以点击菜单项打开pdf。但是当我从jar文件运行时它没有打开。我清理并构建我的项目。但没有变化。从netbeans运行但不从jar文件运行时运行。 我需要添加一些库吗?
我的代码如下
m_aboutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Runtime rt = Runtime.getRuntime();
//System.out.println(Menubar1.getDefaultLocale());
URL link2=Menubar1.class.getResource("/newpkg/Documentation.pdf");
String link=link2.toString();
link=link.substring(6);
System.out.println(link);
System.out.println(link2);
String link3="F:/new/build/classes/newpkg/Documentation.pdf";
try {
Process proc = rt.exec("rundll32.exe url.dll,FileProtocolHandler " + link2);
} catch (IOException ex) {
Logger.getLogger(Menubar1.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
也试过这个但是得到同样的东西..当我从netbeans运行而不是从jar应用程序运行时,我可以从menuitem打开pdf。
m_aboutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
URL link2=Menubar1.class.getResource("/newpkg/Documentation.pdf");
String link=link2.toString();
link=link.substring(6);
System.out.println(link);
File file=new File(link);
System.out.println(file);
try {
desktop.open(file);
} catch (IOException ex) {
Logger.getLogger(Menubar1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
从netbeans为第二个代码运行时,所有system.out.println()的输出如下
run:
F:/new/build/classes/newpkg/Documentation.pdf F:\新\建造\类\ newpkg \ Documentation.pdf 建立成功(总时间:5秒)
答案 0 :(得分:1)
rundll32.exe
无法处理现在位于Jar内的资源。检查getResource(String)
返回的网址。
..但仍然无法正常工作..
问题是rundll32
至少对于File
个实例来说只是URL
个实例。消耗(例如显示)PDF的工具通常不被设计为接受命令行参数。代表URL
。如果File
应该指向File
,则该过程可以继续。但是一旦PDF在Jar中,它就只是Jar中的一个条目。或者换句话说,不是URL
。
如果推理正确,在默认软件中显示PDF的一种方法是:
URL
到PDF。File
是否指向Jar(它将包含'!')。如果它..
File
。 答案 1 :(得分:1)
您可以使用Java 6和Desktop
API吗?
并且在启动时可以将文件导出或下载到磁盘吗?
答案 2 :(得分:0)
try //try statement
{
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + "c:\\chart.pdf"); //open the file chart.pdf
} catch (Exception e) //catch any exceptions here
{
System.out.println("Error" + e ); //print the error
}