【问题标题】:Jdialog not getting focused in IE9Jdialog 没有专注于 IE9
【发布时间】:2012-04-03 05:18:15
【问题描述】:

我正在从一个小程序背靠背调用 2 jDialog。一旦我从第一个对话框中选择选项并单击“确定”按钮,小程序窗口就会获得焦点,而第二个对话框会失去焦点。

该问题仅在 IE 中出现,并且在 firefox 和 chrome 中运行良好。请输入代码 sn-p。 (虽然我的完整代码中的实际问题只出现在 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>

我能得到一些帮助吗?

【问题讨论】:

  • 那么我想你需要展示一些很好的构建SSCCE
  • SSCCE 已准备好,如何分享
  • 请用您的 SSCCE 编辑您的问题,就是这样,用这个新代码替换以前的代码。
  • 给我一些时间,同时,让我告诉你一些你做错了的事情。您将SwingAWT 混合在一起,这在任何意义上都被认为是好的:(
  • 实际上在我这边它按预期工作,JDialogs 都得到了关注,而没有将焦点恢复到Main Application。我的 IE 9 版本是9.0.8112.16421 (Updated Version : 9.0.5 (KB2647516)),希望我的版本和你的一样!!

标签: java swing internet-explorer-9


【解决方案1】:

这种行为可能取决于您在其中运行小程序的浏览器(并且您似乎已经证明了这一点),所以我建议您尝试在对话框(或其中的组件)上调用 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 () - 这应该会弹出对话框并将焦点转移到其中。

【讨论】:

  • 我已经尝试在对话框对象的 setVisible 方法之后调用“requestFocus()”。我们是否需要同时调用 requestFocus() 和 requestFocusInWindow()。
  • 调用后者,而不是前者,就像编译器警告敦促你做的那样。
  • 如果对话框是模态的,并且您在 setVisible 之后调用这些方法,请注意它不起作用,因为此方法仅在模态对话框关闭后返回。为确保对话框获得焦点,您需要调用 requestFocus()。虽然它在不同的操作系统上可能会有所不同。
  • 我尝试在面板、optionPane、对话框和 rateCombo(对话框中的组件)的 setVisible() 方法之前和之后调用这两种方法。但小程序越来越集中。我还检查了 requestFocusInWindow() 方法在所有这些情况下都返回 false。有人可以为此提供代码sn-p,这将有所帮助。
  • 检查更新后的帖子 - 我添加了更多描述。顺便说一句 - 您是否正确指定了对话框父级?
猜你喜欢
  • 2013-08-16
  • 2016-02-08
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多