【问题标题】:Java JFrame popup windowJava JFrame 弹出窗口
【发布时间】:2013-11-19 20:58:02
【问题描述】:

所以我对 Java Swing 还很陌生,并且偶然发现了一些困难。我有一个正在运行的主框架(应用程序的主要部分在应用程序的执行过程中可见),它有一个按钮,一旦单击,就会调用一个弹出框架(窗口)来收集用户的信息,并且该框架有一些组件。问题是我真的不知道调用弹出窗口的正确方法,主窗口冻结执行并等待确定,或者单击弹出窗口上的取消按钮。一旦发生这种情况,主窗口代码会从弹出窗口中收集返回的值并继续。我尝试使用同步来完成此操作,但是弹出组件甚至不加载,只有 JFrame 和 JPanel(白色背景)并且弹出窗口在 wait() 条件下冻结。我知道有一种方法可以使用 JDialog 和其他方法,但我主要关心的是发现为什么弹出框不加载组件并在 wait() 条件之前冻结。 (当我摆脱 wait() 一切正常加载)。

    //in Main window Class:
    frame.setEnabled(false);
    Test test = getNewTest(); //should freeze on wait() in popup window
    frame.setEnabled(true);

    //in Popup Window Class
    public Test getNewTest() {

    addPanel.setVisible(true);
    addFrame.setVisible(true);

    synchronized(flag) {
        try {
            flag.wait();
        } catch (InterruptedException e) {}
    }

    addPanel.setVisible(false);
    addFrame.setVisible(false);

    if(success)
    return new Test(testName, date);
    else return null;
}


    //When OK or Cancel button clicked appropriate handler sets
    //success value and invokes flag.notify();

【问题讨论】:

    标签: java swing dialog jframe popupwindow


    【解决方案1】:
    • 从您的代码中获取所有同步和等待的内容。所要做的就是冻结 Swing 事件线程,使您的应用程序无用。
    • 您不想使用第二个 JFrame,因为应用程序通常只有一个主窗口或 JFrame,而不是多个。
    • 您希望改用模态对话框,例如 JOptionPane(可以容纳复杂的 GUI)或模态 JDialog(也可以容纳复杂的 GUI)。确保将模式对话框与父 JFrame 相关联。然后 Swing GUI 库将冻结主窗口,直到处理完对话框,并且在对话框不再可见后,主 GUI 中的代码将从对话框可见的位置恢复。

    【讨论】:

    • 小说明:模态对话框不会冻结主窗口,但会阻止用户交互,正如here所建议的那样。
    • @trashgod:感谢您的澄清。但它不仅仅是阻止用户交互,因为它实际上在对话框设置为可见的位置停止了调用代码中的程序流。处理完对话后,程序流程将从同一点恢复。
    • 好点。我看到教程使用两个短语来描述这一点:blocks inputcaptures the window focus。我的意思是强调主窗口仍然可以根据事件更新其外观。
    • @trashgod:确实可以。但是对于我自己的项目,我注意到在对话框设置为可见之前将所有侦听器(例如 SwingWorker PropertyChangeListeners)添加到代码中是至关重要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多