【问题标题】:Can't work with swing UI within applet - calling public method无法在小程序中使用 Swing UI - 调用公共方法
【发布时间】:2012-05-29 17:10:30
【问题描述】:

我的问题如下:我在 HTML 页面中嵌入了一个 JApplet 和一个带有小程序公共方法的 JS 调用的 form 按钮:

<input id="btnAppletSelectFiles" type="button" value="Select Files" 
    onclick="document.appletExcelUploader.SelectFiles();" />

在我的 JApplet 中,我有 FileChooser,例如:

public class ExcelUploader extends JApplet {

    private JFileChooser fc = new JFileChooser();
    // Some stuff
}

我正在我的小程序的公共方法中编写这样的代码:

  public void SelectFiles() {
        int retVal = fc.showOpenDialog(ControlsPanel.this);

        if (retVal == JFileChooser.APPROVE_OPTION) {
            for (File file : fc.getSelectedFiles()) {
                System.out.println(file.getName());
            }
        }
    }

因此,当单击 HTML 按钮时,文件对话框正常显示,我可以浏览目录并检查文件,但我无法按 OpenOK 按钮 - 我单击它但对话框仍然存在。

我认为我的线程有问题 - 我仍然以某种方式在“HTML 和 JS”线程中执行此操作,而不是在我的小程序的 GUI 线程或事件调度线程中。

如何解决问题?

【问题讨论】:

  • 但是如果我只是在小程序中添加一个按钮并从那里调用对话框,一切都可以。
  • - Applet 上传工作是否与 Java 代码签名或未签名 - JS 浏览器线程使用 UI 访问小程序并停止工作 - Applet 在浏览器线程中执行 - 如果所有浏览器的安全性相同看起来合乎逻辑的线程,问题在于线程间通信

标签: java javascript swing applet japplet


【解决方案1】:

从 JavaScript 调用的受信任小程序中的方法不再受信任,因为 Java 无法解释堆栈中的所有代码帧。要解决此问题,请使用AccessController.doPrivileged(..) 重载方法之一。

【讨论】:

  • 谢谢,代码看起来很奇怪,但现在可以使用 AccessController.doPrivileged(new PrivilegedAction&lt;String&gt;() { public String run() { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { controls.selectFiles(); } }); } catch (Exception e) { logger.error(e.getMessage(), e); } return "42"; } });
猜你喜欢
  • 2018-12-08
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多