我们使用部署在信息亭类型环境中的 Firefox 18.0.1 来运行签名的小程序。JDK 和 JRE 都是 JavaSE 7u11。签名的 jar 让我们可以完成沙盒小程序通常无法为其用户做的所有事情(漫游本地磁盘、与打印机通信、窃取他们的所有 pr0n 等)。
小程序和加载它的页面共同生成一些 HTML 和 JavaScript;然后 JavaScript 和小程序以一种几乎无缝的方式来回交谈。有时小程序会创建弹出对话框;这些要么由用户单击 Java 组件触发,要么由用户单击某些带有“onclick”脚本的 HTML 小部件触发,该脚本告诉小程序进行对话。
在上周,我注意到一些小程序的弹出对话框有些奇怪。他们在对话框外挂着一个小警告图标:
如果用户移动它,该图标将粘在对话框上。将鼠标悬停在图标上会弹出一个小的“Java Applet Window”工具提示,这特别有趣,因为并非我们所有的对话框都与它一起出现。
该快照中显示的窗口是使用此测试代码创建的。(是的,使用 JOptionPane 有更短的方法,但它不会复制我们的实际代码。一些对话框比其他对话框更定制。)
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.
}
}
我花了大约一个小时与 Google 相处,希望它能向我揭示一些东西,但我找不到任何关于此的提及。这是 Firefox 的事情还是 JRE 的事情?或者,更好的问题:是什么导致警告图标出现在某些对话框而不是其他对话框上?