显示JFrame

3

我有问题想知道如何在一个子类中启动的窗口关闭后打开另一个窗口。以下是我试图使用的笨拙代码,但它会停止子类窗口的可见设置。可能是由于它位于操作事件内部或者它会阻止主线程。

    tutorial = new tutorialWindow();
    this.setVisible(false);
    tutorial.setLocationRelativeTo(null);
    tutorial.setVisible(true);
    tutorial.setCurrentUser(users.getCurrentUser());

    while(tutorial.isOpen() == true ) {
    }
    this.setVisible(true);
    users.updateUser(tutorial.getCurrentUser());

我的想法是它会被卡在代码段中,直到其他窗口关闭并且教程窗口由于打破while循环而设置为false时再次出现。

我相信这只是使用正确的线程,或者可能是使用各种notify方法的问题,但是现在我不确定如何做到这一点。


1
  1. 为了更快地得到帮助,请发布一个SSCCE
  2. 不要使用多个窗口,请使用CardLayout
- mKorbel
我出于各种原因正在使用空布局。 - Liam B
1
@LiamB:在任何情况下,绝对定位都几乎不需要。为了让别人能够对您的查询发布一个好的答案,请发布一个SSCCE - nIcE cOw
@nIcE cOw:好的,我会做的,但是甚至为了寻求替代while循环来管理JFrames而编写一个小类都几乎没有意义。这个项目需要绝对位置,在Netbeans IDE中使用大量动画和覆盖的jLabel,如果不使用null布局,它们将无法格式化。 - Liam B
@LiamB:但是在GUI中使用while(true)循环可能会阻塞您的EDT-事件分派线程。看起来Francisco的答案是正确的选择 :-) 给那个答案点赞+1 - nIcE cOw
是的,我仍然卡住了,主要是由于糟糕的类组织,但已经太晚改正了(哎呀),请查看那个答案的评论,也许你有解决方案。谢谢 :)。 - Liam B
1个回答

4
您可以使用WindowListener来实现它。在以下示例中,WindowAdapter实现了WindowListener,我只需要重写public void windowClosed(final WindowEvent e)方法,打开第二个窗口即可。
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestJFrame {

    public static void main(final String args[]) {
        JFrame jFrame1 = new JFrame();
        jFrame1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        jFrame1.add(new JLabel("First JFrame"));
        jFrame1.pack();

        final JFrame jFrame2 = new JFrame();
        jFrame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        jFrame2.add(new JLabel("Second JFrame"));
        jFrame2.pack();

        jFrame1.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(final WindowEvent e) {
                jFrame2.setVisible(true);
            }
        });

        jFrame1.setVisible(true);

    }

}

我认为这会起作用,问题是我有自定义的关闭按钮,它们由JLabels制成,运行this.dispose(); 现在该如何集成它? - Liam B
哦,抱歉,是我的错:我实现了 windowClosing 但正确的应该是 windowClosed,只需更改它,你会发现它可以工作。 - Francisco Spaeth
嗯,我想一想,这样行不通。如果两个JFrames都在同一个类中声明,那么它会起作用,但是由于我要关闭的JFrame是在一个类中声明的,而该类又在主JFrame中声明,所以我无法从教程窗口(在类层次结构中较低处声明)引用主JFrame的set visible。 - Liam B
我认为现在我会让主窗口不关闭,而是隐藏在后台,这样我就不需要重新打开它,这将解决问题。但我仍然想知道如何正确地解决这个问题。 - Liam B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接