【问题标题】:Java Swing - Keeping all JFrames togetherJava Swing - 将所有 JFrame 放在一起
【发布时间】:2016-04-18 01:47:14
【问题描述】:

我有一个应用程序,有时我在其中使用“模态”较小的窗口。为了模拟这种模态行为,我将它们定义为 JFrame 的扩展,禁用主应用程序框架并将默认关闭操作设置为不执行任何操作。问题在于 JFrame 不能有父级,因此,当用户单击关闭窗口的按钮时,它实际上会关闭,系统会返回上次使用的应用程序,这并不总是想要的效果(例如,用户打开模态窗口,然后他/她 Alt+Tabs 进入另一个应用程序,然后切换回模态窗口并关闭它,从而呈现最后一个应用程序,而不是我的主框架)。有什么方法可以做到这一点(将 JFrame 绑定到父级或类似的东西......?)。请注意,JOptionPane 不是一个选项,因为这些较小的窗口需要在每个窗口中包含大约 20 个不同的自定义组件。

【问题讨论】:

  • 你为什么不去JDesktopPane ??使用方法可以看这里:docs.oracle.com/javase/tutorial/uiswing/components/…
  • 看起来是个不错的选择,但 JDialog 似乎更易于使用,因为 JDesktopPane 是 JFrame 的容器,因此我仍然需要 JFrame,但 JDialog 允许我简单地替换“扩展 JFrame”与“扩展 JDialog”。无论如何,请投票,因为我从未听说过这门课,而且看起来很有用。
  • JDesktopPane 是JInternalFrame 的容器,而不是JFrame..
  • 啊,对不起,我错了,所以 JDesktopPane 可以用作 JFrame 的 setContentPane 的参数,这就是您建议的方式,不是吗?谢谢!

标签: java swing jframe


【解决方案1】:

为什么不使用JDialog? :-)

【讨论】:

    【解决方案2】:

    您可以将 JFrame 参数添加到构造函数并在内部将其保存为父级,并将子级的引用保存在父级的列表中。然后,您可以覆盖 dispose 方法并在关闭窗口之前关闭所有子/父。

    例如:

    public class ParentWindow extends JFrame {
    
        //Here you add children when you create them
        List<JFrame> children = new ArrayList<JFrame>();
    
        @Override
        public void dispose() {
            for(JFrame f : children) {
                f.dispose();
            }
            super.dispose();
        }
    
        public void randomMethod() {
            JFrame newWindow = new JFrame(this);
            children.add(newWindow);
        }
    }
    
    public class ChildWindow extends JFrame {
    
        //Here you save the parent window
        JFrame parent;
        public ChildWindow(JFrame parent) {
             this.parent = parent;
        }
    
        @Override
        public void dispose() {
            parent.dispose();
            super.dispose();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2011-05-25
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多