在swing 1.5中指定的时间后自动关闭非模态对话框

时间:2012-10-02 12:23:41

标签: java multithreading swing jdialog

在Swing for Java 1.5中,我想创建一个对话框,允许用户在后台执行其他操作。我希望此对话框有一个按钮,您可以使用该按钮关闭对话框。如果用户未在X秒内关闭对话框,则应自行关闭。在这两种情况下,必须在对话框关闭后执行例程。

我尝试使用Swing Timer和一个模态对话框,它可以工作。但是,正如我上面提到的,我需要一个非模态对话框。当我将modal-Property设置为false时,对话框会立即消失。

有人知道,为什么会这样?

JOptionPane pane =  new JOptionPane (text, JOptionPane.WARNING_MESSAGE);
pane.setOptions(new String[]{"Close"});
final JDialog dialog = pane.createDialog(frame, title);
//dialog.setModal(false);

Timer timer = new Timer(time, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        dialog.setVisible(false);
    }
});
timer.setRepeats(false);
timer.start();

dialog.setVisible(true);

//routine to do after the dialog disappears

2 个答案:

答案 0 :(得分:2)

  1. 为了在SSCCE发布后提供更好的帮助,没有关于MultiThreading的代码或说明

  2. 不要在运行时创建final JDialog dialog = pane.createDialog(frame, title);,创建此JDialog一次,然后重新使用该操作以执行其他操作,和/或从ContentPane删除所有子项

  3. 覆盖WindowListener中的正确事件,您可以在dipose()setVisible() e.i之前调用自定义代码。

  4. (指向第2点。)只需将JDialog#setDefaultCloseOperation覆盖为HIDE_ON_CLOSE

  5. 在运行时调用新Top-Level Container的所有代码都必须包含在invokeLater()中,尤其是setVisible(true)

  6. 使用Application Inactivity by @camickr

答案 1 :(得分:2)

在此example中,包含direct JOptionPane的无模式JDialog在关闭之前倒数至零。附近的JFrame包含标签仍然具有响应性。

附录:由于@mKorbel有助于评论,您的班级可以使用PropertyChangeListener来了解对话框的选项窗格何时关闭。这是一个方便featureJOptionPane,但您可以添加自己的支持,如图here所示。

image