我正在开发一个帮助小程序来管理大文件的传输。我们目前有一个applet来管理完整的事务,从选择包含文件的文件夹,传输它们,以及报告操作的成功和失败,但它在很多方面都非常不令人满意。所以现在我们只需要applet的非常微妙的帮助,让用户在本地机器上找到一个文件夹并管理传输。我们希望尽可能多的反馈和用户交互来使用基于Web的控件。因此,您可以想象这需要在浏览器中相当广泛地使用applet和Javascript之间的桥梁。
在大多数情况下,这是相当简单的,但我发现了一个奇怪的边缘情况。我有一个方法弹出一个JFileChooser对话框,然后查看该文件夹的内容并将其报告回来。当我在start()方法中创建JButton并使用它来弹出JFileChooser时,我有这个工作。但是我将JFileChooser的所有代码放入一个名为showFolderSelect()的方法中,这样我也可以尝试从Javascript打开JFileChooser。所以这个来自applet的调用工作:
public void actionPerformed(ActionEvent event) {
if ("browse".equals(event.getActionCommand())) {
showFolderSelect();
}
}
但是来自Javascript的这个调用不会:
function selectFolder() {
var infoApplet = document.getElementById('infoApplet');
infoApplet.showFolderSelect();
}
Javascript调用在Opera的控制台中收到以下消息:
[5 October, 2003 6:26:56 AM] JavaScript - http://localhost:8080/applet-webapp/
Event thread: click
Uncaught exception: Error: java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
Error thrown at line 20, column 12 in selectFolder() in http://localhost:8080/applet-webapp/:
infoApplet.showFolderSelect();
called from line 1, column 0 in <anonymous function>(event) in http://localhost:8080/applet-webapp/:
selectFolder();
关于如何通过Javascript实现此功能的任何想法?或者我只是要使用在applet的start()方法中创建的JButton?
请注意,我不能指望用户能够使用java.policy配置或类似的东西。对我们可以预期的安全性和访问控制的唯一认可是applet(经过数字签名)。
感谢您对此问题的任何帮助或见解。
答案 0 :(得分:0)
我认为这说明了Java可以做什么以及JavaScript无法做什么。看起来JavaScript不允许调用允许访问客户端系统的方法。也许对Java代码的JavaScript访问仅限于未签名的小程序所允许的内容。
如果这只是Java-JavaScript桥的限制,我无法想象有什么方法可以解决这个问题。对我而言,它看起来就像是。
如果您对applet中的整体用户体验不满意,请考虑将其移至JavaFX而不是使用JavaScript的纯浏览器界面。
查看Java FX Ensemble gallery以获取可以使用的UI组件列表。
答案 1 :(得分:0)
在大多数现代Web浏览器中,JS应用程序可能只会打开“文件”对话框以响应用户操作。因此,您可以从onclick处理程序(显然,包括Java applet中的处理程序)创建一个“打开文件”对话框,但不能从例如一个onload处理程序。
因此,您可能需要创建一个按钮或<a href="#"/>
供用户单击,然后在该事件处理程序内调用showFolderSelect()
。