Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing—将所有JFrame保持在一起_Java_Swing_Jframe - Fatal编程技术网

Java Swing—将所有JFrame保持在一起

Java Swing—将所有JFrame保持在一起,java,swing,jframe,Java,Swing,Jframe,我有一个应用程序,其中有时我使用“模态”,更小的窗口。为了模拟这种模式行为,我将它们定义为JFrames的扩展,禁用主应用程序框架,并将默认的close操作设置为nothing。问题是JFrame不能有父应用程序,因此,当用户单击据说要关闭窗口的按钮时,它实际上会关闭,系统会返回到上次使用的应用程序,这并不总是理想的效果(例如,用户打开模式窗口,然后他/她将Alt+选项卡切换到另一个应用程序,然后切换回模式窗口并关闭它,结果显示的是最后一个应用程序,而不是我的主框架)。有没有办法做到这一点(将J

我有一个应用程序,其中有时我使用“模态”,更小的窗口。为了模拟这种模式行为,我将它们定义为JFrames的扩展,禁用主应用程序框架,并将默认的close操作设置为nothing。问题是JFrame不能有父应用程序,因此,当用户单击据说要关闭窗口的按钮时,它实际上会关闭,系统会返回到上次使用的应用程序,这并不总是理想的效果(例如,用户打开模式窗口,然后他/她将Alt+选项卡切换到另一个应用程序,然后切换回模式窗口并关闭它,结果显示的是最后一个应用程序,而不是我的主框架)。有没有办法做到这一点(将JFrame绑定到父级或类似的东西…?)。请注意,JOptionPane不是一个选项,因为这些较小的窗口需要在每个窗口中包含20个不同的自定义组件。

为什么不使用
JDialog
?:-)

您可以将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();
    }
}
公共类父窗口扩展JFrame{
//在这里,您可以在创建子对象时添加它们
List children=new ArrayList();
@凌驾
公共空间处置(){
用于(JF框架:儿童){
f、 处置();
}
super.dispose();
}
公共方法(){
JFrame newWindow=新JFrame(此);
添加(新窗口);
}
}
公共类ChildWindow扩展了JFrame{
//在这里保存父窗口
JFrame父代;
公共子窗口(JFrame父窗口){
this.parent=parent;
}
@凌驾
公共空间处置(){
parent.dispose();
super.dispose();
}
}

为什么不选择
JDesktopPane
??您可以在这里了解如何使用它:看起来是一个不错的选择,但是JDialog似乎更容易使用,因为JDesktopPane是JFrame的容器,因此我仍然需要JFrame,但是JDialog允许我简单地将“extendsjframe”替换为“extendsjdialog”。无论如何,请投票,因为我从未听说过这个类,而且看起来很有用。
JDesktopPane
JInternalFrame
的容器,而不是
JFrame
。啊,是的,很抱歉我错了,所以JDesktopPane可以用作设置JFrame的contentpane的参数,这就是你建议的方式,不是吗?谢谢另见