Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 小程序弹出窗口在对话框外获得一个悬停警告图标_Java_Firefox_Applet - Fatal编程技术网

Java 小程序弹出窗口在对话框外获得一个悬停警告图标

Java 小程序弹出窗口在对话框外获得一个悬停警告图标,java,firefox,applet,Java,Firefox,Applet,我们正在使用部署在kiosk类型环境中的Firefox 18.0.1来运行签名小程序。JDK和JRE都是JavaSE7U11。签名jar允许我们做沙盒小程序通常不能为其用户做的所有事情(漫游本地磁盘、与打印机交谈、窃取其所有pr0n等) applet和加载它的页面共同生成一些HTML和JavaScript;JavaScript和applet然后以一种几乎无缝的方式来回对话。有时小程序会创建弹出对话框;它们要么由用户单击Java组件触发,要么由用户单击带有“onclick”脚本的HTML小部件触发

我们正在使用部署在kiosk类型环境中的Firefox 18.0.1来运行签名小程序。JDK和JRE都是JavaSE7U11。签名jar允许我们做沙盒小程序通常不能为其用户做的所有事情(漫游本地磁盘、与打印机交谈、窃取其所有pr0n等)

applet和加载它的页面共同生成一些HTML和JavaScript;JavaScript和applet然后以一种几乎无缝的方式来回对话。有时小程序会创建弹出对话框;它们要么由用户单击Java组件触发,要么由用户单击带有“onclick”脚本的HTML小部件触发,该脚本告诉小程序创建一个对话框

上周,我注意到小程序的一些弹出对话框有些不稳定。对话框外部悬挂着一个小小的警告图标:

如果用户移动该图标,该图标将粘在对话框上。将鼠标悬停在图标上会弹出一个小的“JavaApplet窗口”工具提示,这非常有趣,因为并不是所有对话框都与它一起出现

该快照中显示的窗口是使用此测试代码创建的。(是的,使用JOptionPane的方法较短,但它不会复制我们的实际代码。有些对话框比其他对话框更为定制。)


我花了大约一个小时与谷歌拥抱,希望它能向我透露一些东西,但我在那里找不到任何关于这一点的提及。这是Firefox还是JRE?或者,更好的问题是:是什么导致警告图标出现在某些对话框上而不是其他对话框上?

嗯,现在我觉得自己很傻。我已经玩了好几个小时了,什么都没得到,把问题贴在这里,去喝我的第14杯咖啡,然后在搅拌奶油的时候,我得到了答案。区别在于:

用户单击已签名的小程序小部件直接触发的弹出窗口是“正常”的

用户单击HTML/JavaScript对象触发的弹出窗口,以及调用签名Java函数的“onclick”脚本,都会标记为警告

每当javascript函数调用带签名的小程序时,该小程序在调用长度上被视为未签名。这可能是一个类似的预防措施,但我还没有证实这一点。在这两种情况下,解决方案是相同的:找到需要“不,这真的是安全的,我是认真的”状态的最小的代码段,并在其周围包装一个
privilegedeceptionAction
。或者至少,这是将其他javascript转换为带签名的小程序调用的正确解决方案,所以我在这里尝试了它,它成功了。:-)


在我们的实际代码中,显示对话框的部分(从
createDialog
开始)具有自己的功能。将对该函数的调用替换为
AccessController.doPrivileged()
,对该函数的包装调用会处理所有问题。没有更多的警告图标

这是一个firefox的东西。@fmodos如果你能提供更多的信息(并且让你的答案更长;),我建议你回答这个问题。。。我的错误是,我在这篇文章中做了一个非常快速的阅读,错过了他说它只发生在HTML事件中的部分,无论如何,我只是做了一个快速的研究,下面的链接似乎有一个解决这个问题的方法@fmodos好链接,谢谢!他们似乎采取了“轮询式”方法,即不安全线程为安全线程设置要测试和响应的标志。这是使用
privilegedeceptionAction
的常见替代方法,但我不知道为什么使用priv'd action一开始并不能像对我一样解决问题。问得好。经过仔细研究的答案。很高兴你把它整理好了。:)
import java.awt.BorderLayout;

import javax.swing.JApplet;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class WhereTheHellDoesTheIconComeFrom
{
    private JPanel topPanel;

    public WhereTheHellDoesTheIconComeFrom (JApplet applet) {
        // Multiple panels with a text blob in each
        JLabel exampleText = new JLabel ("some text here", JLabel.CENTER);
        topPanel = new JPanel (new BorderLayout(5,0));
        topPanel.add (exampleText, BorderLayout.CENTER);

        // Create the options pane.
        Object allpanels[] = new Object[] {
            topPanel,
        };
        Object buttons[] = { "B1", "B2" };

        JOptionPane optionPane = new JOptionPane (allpanels,
            JOptionPane.PLAIN_MESSAGE,
            JOptionPane.OK_CANCEL_OPTION,
            null,   // no icon built in
            buttons,
            buttons[0]);  // select this button by default

        // Ask it for the visible popup.
        JDialog dialog = optionPane.createDialog(
            SwingUtilities.getWindowAncestor(applet),
            "This is the title text");
        dialog.setResizable(false);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
        // Modal dialog blocks on the previous line; at this point I can
        // examine getValue() and make decisions, etc, etc.
    }
}