我正在从一个applet调用2 jDialog。一旦我从第一个对话框中选择了该选项并单击“确定”按钮,小程序窗口便会聚焦,而第二个对话框便失去了焦点。
该问题仅在IE中出现,并且在Firefox和chrome中可以正常工作。请输入代码段。 (尽管我完整代码中的实际问题仅发生在IE9中,但我不确定为什么这在SSCCE的IE8中不起作用)
public class SampleApplet extends Applet{
protected JButton countryButton = new JButton("Select");
public synchronized void init()
{
this.setBounds(new Rectangle(350,350));
this.add(countryButton);
countryButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
getCountries();
getCountries();
}
});
}
protected void getCountries() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
JComboBox CountriesCombo = new JComboBox();
CountriesCombo.addItem("India");
CountriesCombo.addItem("Japan");
panel.add(CountriesCombo, gbc);
JOptionPane optionPane = new JOptionPane(panel, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
final JDialog dialog = optionPane.createDialog(panel, "Select Countries");
dialog.setModal(true);
dialog.addWindowListener ( new WindowAdapter ()
{
public void windowOpened ( WindowEvent e )
{
dialog.requestFocus ();
}
});
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
}
HTML代码:
<html>
<head>
<title>Sample Code</title>
</head>
<body>
<applet code="SampleApplet.class" width="350" height="350">
</applet>
我可以在这方面寻求帮助吗?
最佳答案
这种行为可能取决于您在其中运行applet的浏览器(似乎已经证明了这一点),因此我建议您尝试在对话框(或其中的组件)上调用requestFocus()和requestFocusInWindow()以获取将焦点放到对话框中。
再说一次-如果您在打开对话框之前(在setVisible(true)之前)请求焦点,则该对话框将失败,因为该对话框尚未显示。如果在setVisible(true)方法之后调用它-如果您的对话框(或OptionPane)是模式对话框-它仅在关闭对话框时执行,因此在那里也没有意义。您应该在您的对话框中添加一个WindowListener,并在对话框打开后请求焦点。
检查以下示例:
public static void main ( String[] args )
{
// Modal dialog
final JDialog dialog = new JDialog ( );
dialog.setModal ( true );
// Adding listener
dialog.addWindowListener ( new WindowAdapter ()
{
public void windowOpened ( WindowEvent e )
{
dialog.requestFocus ();
}
} );
// Displaying dialog
dialog.setVisible ( true );
}
尽管如此,dialog.requestFocus()仍是一个依赖于平台的调用,它可能不会将对话框聚焦/弹出到其他打开的窗口之上。在所有Windows版本中,它应该都能正常工作。
您也可以尝试使用dialog.toFront()-这将弹出对话框并将焦点转移到其中。