【问题标题】:Modeless JDialog needs to be visible on top of parent无模式 JDialog 需要在父级之上可见
【发布时间】:2012-04-23 20:18:41
【问题描述】:

我的应用程序能够启动长时间运行的任务。发生这种情况时,会生成一个无模式的JDialog,显示任务的进度。我特别使对话框无模式,以允许用户在任务运行时与 GUI 的其余部分进行交互。

我面临的问题是,如果对话框隐藏在桌面上的其他窗口后面,则很难找到:任务栏上没有相应的项目(在 Windows 7 上),下面也没有可见的图标Alt+Tab 菜单。

有解决这个问题的惯用方法吗?我曾考虑将WindowListener 添加到应用程序的JFrame 并使用它来将JDialog 带到前台。但是,这可能会变得令人沮丧(因为这可能意味着 JFrame 会失去焦点)。

【问题讨论】:

  • 为什么不使用 JFrame 来代替?这是主要区别之一:任务栏中的按钮。
  • 因为我不希望对话框提供最大化或最小化功能。
  • 你可以使用 setResizable(false);我会允许最小化,否则,应用程序可能有点冒犯,IMO。
  • 您是否将父框架/对话框传递给该进度对话框?如果是这样,那么将父级放在前面也应该带来对话框(并且通过将 modal 设置为 false,用户仍然可以访问 GUI 的其余部分)

标签: java swing jdialog


【解决方案1】:

您可以创建一个非模态对话框并为其提供父框架/对话框。当您调出父框架/对话框时,它也会带来非模态对话框。

这样的事情说明了这一点:

public static void main(String[] args) throws IOException {
    JFrame frame = new JFrame();
    frame.setTitle("frame");
    JDialog dialog = new JDialog(frame, false);
    dialog.setTitle("dialog");
    final JButton button = new JButton("Click me");
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(button, "Hello");
        }
    });
    final JButton button2 = new JButton("Click me too");
    button2.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(button2, "Hello dialog");
        }
    });
    frame.add(button);
    dialog.add(button2);
    frame.pack();
    dialog.pack();
    frame.setVisible(true);
    dialog.setVisible(true);
}

【讨论】:

  • 谢谢 - 这很奏效。看起来我正在设置对话框相对于父组件的位置,但实际上并没有使用所有者构建 JDialog。
猜你喜欢
  • 2012-04-19
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
相关资源
最近更新 更多