Java 当浏览器';s选项卡已切换
我的问题似乎与此非常相关,但它并没有提供一个有效的解决方案 我已经开发了一个使用JWS/JNLP部署的小程序。它从显示“新游戏”对话框开始Java 当浏览器';s选项卡已切换,java,javascript,swing,jdialog,japplet,Java,Javascript,Swing,Jdialog,Japplet,我的问题似乎与此非常相关,但它并没有提供一个有效的解决方案 我已经开发了一个使用JWS/JNLP部署的小程序。它从显示“新游戏”对话框开始 CustomDialog只是扩展了JDialog: public class CustomDialog extends JDialog implements WindowListener { public CustomDialog(Container cont, String title, ModalityType modalityType) {
CustomDialog
只是扩展了JDialog
:
public class CustomDialog extends JDialog implements WindowListener {
public CustomDialog(Container cont, String title, ModalityType modalityType) {
super(windowForComponent(cont), title, modalityType);
}
public static Window windowForComponent(Component c) {
if (c instanceof Window) return (Window) c;
return SwingUtilities.windowForComponent(c);
}
...
这就是如何从GUI类调用JDialog
:
public void requestNewGame () {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
NewGameDialog dialog = new NewGameDialog();
dialog.setVisible(true);
}
});
}
我使用了中描述的不同类型的情态。目标是在用户切换到浏览器中的另一个选项卡时隐藏JDialog
。但所有的选择似乎都不起作用。该对话框在所有选项卡上保持浮动
请告知,当用户移动到另一个选项卡时,如何隐藏对话框,当用户返回到我的小程序选项卡时,如何再次显示对话框?假设当选项卡更改时,父组件会更改屏幕上的位置,则此操作有效。例如
JDialog.getParent().getLocationOnScreen()
经过测试并被视为在以下环境中工作:
- Firefox19.0
- Chrome版本25.0.1364.97 m
- Internet Explorer 8.0.7601.17514
对话框。除无模式
之外的ModalityType
值拒绝访问浏览器选项卡或导致安全异常
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogApplet extends JApplet {
@Override
public void init() {
Runnable r = new Runnable() {
@Override
public void run() {
initGUI();
}
};
SwingUtilities.invokeLater(r);
}
public void initGUI() {
JButton b = new JButton("Show Dialog");
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
showDialog();
}
};
b.addActionListener(listener);
add(b);
}
private JDialog d;
JTextArea output;
int currentX = -1;
Timer timer;
public void showDialog() {
if (d==null) {
output = new JTextArea(5,20);
Window w = SwingUtilities.windowForComponent(this);
d = new JDialog(w, "Dialog", Dialog.ModalityType.MODELESS);
//Dialog.ModalityType.TOOLKIT_MODAL); //security
//Dialog.ModalityType.DOCUMENT_MODAL);
//Dialog.ModalityType.APPLICATION_MODAL);
d.add(output, BorderLayout.CENTER);
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
StringBuilder sb = new StringBuilder();
sb.append("parent location: \t" +
d.getParent().getLocation() + "\n");
sb.append("parent location - screen: \t" +
d.getParent().getLocationOnScreen() + "\n");
System.out.print(sb.toString());
output.setText(sb.toString());
if (currentX>-1 &&
currentX!=d.getParent().getLocationOnScreen().getX()
) {
System.out.println( "Goodbye world!" );
d.setVisible(false);
timer.stop();
}
}
};
timer = new Timer(1000, al);
d.pack();
d.setLocationRelativeTo(d.getParent());
}
currentX = (int)d.getParent().getLocationOnScreen().getX();
timer.start();
d.setVisible(true);
}
}
Java脚本
也许相反,我们应该看看JS。诀窍似乎在于检测HTML窗口焦点/模糊事件。例如,如以下问题的答案所述:
显然,当JS检测到选项卡更改时,我们会让它调用小程序中的一个方法,例如
tabVisible()
或tabHidden()
,以对对话框执行适当的操作。这是基于当选项卡更改时父组件更改屏幕上的位置的假设。例如
JDialog.getParent().getLocationOnScreen()
经过测试并被视为在以下环境中工作:
- Firefox19.0
- Chrome版本25.0.1364.97 m
- Internet Explorer 8.0.7601.17514
对话框。除无模式
之外的ModalityType
值拒绝访问浏览器选项卡或导致安全异常
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogApplet extends JApplet {
@Override
public void init() {
Runnable r = new Runnable() {
@Override
public void run() {
initGUI();
}
};
SwingUtilities.invokeLater(r);
}
public void initGUI() {
JButton b = new JButton("Show Dialog");
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
showDialog();
}
};
b.addActionListener(listener);
add(b);
}
private JDialog d;
JTextArea output;
int currentX = -1;
Timer timer;
public void showDialog() {
if (d==null) {
output = new JTextArea(5,20);
Window w = SwingUtilities.windowForComponent(this);
d = new JDialog(w, "Dialog", Dialog.ModalityType.MODELESS);
//Dialog.ModalityType.TOOLKIT_MODAL); //security
//Dialog.ModalityType.DOCUMENT_MODAL);
//Dialog.ModalityType.APPLICATION_MODAL);
d.add(output, BorderLayout.CENTER);
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
StringBuilder sb = new StringBuilder();
sb.append("parent location: \t" +
d.getParent().getLocation() + "\n");
sb.append("parent location - screen: \t" +
d.getParent().getLocationOnScreen() + "\n");
System.out.print(sb.toString());
output.setText(sb.toString());
if (currentX>-1 &&
currentX!=d.getParent().getLocationOnScreen().getX()
) {
System.out.println( "Goodbye world!" );
d.setVisible(false);
timer.stop();
}
}
};
timer = new Timer(1000, al);
d.pack();
d.setLocationRelativeTo(d.getParent());
}
currentX = (int)d.getParent().getLocationOnScreen().getX();
timer.start();
d.setVisible(true);
}
}
Java脚本
也许相反,我们应该看看JS。诀窍似乎在于检测HTML窗口焦点/模糊事件。例如,如以下问题的答案所述:
显然,当JS检测到选项卡更改时,我们会让它调用applet中的一个方法,例如
tabVisible()
或tabHidden()
,以对对话框执行适当的操作。为了更快地获得更好的帮助,请发布一个。注意:添加了JavaScript标记,因为我认为没有办法使用纯Java提供功能,虽然有通过JS的现有解决方案。为了更快地获得更好的帮助,请发布一个。注意:添加了JavaScript标记,因为我认为没有办法使用纯Java提供功能,而有通过JS的现有解决方案。谢谢!顺便说一句,我正在使用Chrome。今晚或明天,我将能够测试这个示例,并接受它是否对我有效。“如果它有效,接受”它在IE中失败。请参阅更新。我在窗口和按钮上尝试了一个组件侦听器。触发的唯一事件是初始外观,而不是选项卡更改。JS能检测到选项卡的更改吗?如果是这样,这是最好的方法。谢谢!顺便说一句,我正在使用Chrome。今晚或明天,我将能够测试这个示例,并接受它是否对我有效。“如果它有效,接受”它在IE中失败。请参阅更新。我在窗口和按钮上尝试了一个组件侦听器。触发的唯一事件是初始外观,而不是选项卡更改。JS能检测到选项卡的更改吗?如果是这样,这是最好的办法。