Java Swing JFrame处理方法

Java Swing JFrame处理方法,java,swing,pointers,memory,jframe,Java,Swing,Pointers,Memory,Jframe,我想弄清楚这里到底发生了什么。假设我有这三种方法,我不断地反复按下按钮。这是否会导致某种我不知道的内存泄漏或指针链?我的理解是,当一个方法结束时,该方法的任何局部变量都会被清除。这将包括指向新JFrame的“指针”,然后正确吗 再次假设用户正在单击每个帧上的按钮 public class driver { public static void main(String[] args) { // TODO Auto-generated method stub

我想弄清楚这里到底发生了什么。假设我有这三种方法,我不断地反复按下按钮。这是否会导致某种我不知道的内存泄漏或指针链?我的理解是,当一个方法结束时,该方法的任何局部变量都会被清除。这将包括指向新JFrame的“指针”,然后正确吗

再次假设用户正在单击每个帧上的按钮

    public class driver {


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        parentFrame pF = new parentFrame();
    }
}
-

-


我不知道你说的“我不必调用super()”是什么意思,但是如果你想避免混淆,那么要么扩展JFrame,要么在JFrame类型的类中使用一个变量。您既有,又在构造函数中创建变量引用,这样当
JFrame=newparentframe()时时,将创建两个jframe:一个是在其上有
new
操作符的jframe,另一个是在该对象的构造函数中

至于清理,当您执行
setVisible(true)时
在JFrame上,我认为JFrame引用显然被放入Swing系统中,因此方法中的变量(无论是本地变量还是实例(或静态变量))不再是唯一的引用。我认为,
dispose()
是对Swing框架的一条指令,说明代码是用这个变量完成的,在它之后进行清理并删除对它的所有引用。如果您在丢失自己对变量的引用之前不这样做(例如,如果它是一个局部变量,并且您在退出该方法之前没有这样做),那么您将失去调用dispose的机会。我想你还是可以从Swing那里得到一个参考,然后调用dispose


你不能说你是否有内存泄漏的证据,或者只是试图理解这段代码。

我已经阅读了你的问题、答案和评论。我建议您复习OOP基础知识,以便更好地链接对象。关于评论:

如何在父帧中创建新帧,然后处理该帧,但子帧仍保持活动状态。控件是否传递给子帧

每个JFrame都是JFrame对象的独立实例。您不需要手动传递控制。您应该为每个JFrame定义关闭行为:关闭时的主帧将关闭整个程序(关闭时退出),次帧可以有其他行为(关闭时隐藏或关闭时处置)。您可以通过以下方式定义此选项:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

我应该建议您仔细阅读java教程,并确保在深入学习swing之前充分了解类和实例。手动启动将帮助您更好地理解(我看到他们已经告诉您了,但我同意这一点)。继续

注意:您的
ParentFrame
类从
JFrame
扩展而来,但是您使用名为
frame
的类变量来显示该帧,并且不处理任何
ParentFrame
的实例。这可能是导致内存泄漏的原因(尽管没有完全测试)。我只是从类头中删除
扩展JFrame
,并使用局部变量。另外:我使用frame,因此不必调用super(),而且我可以访问frame变量。这是糟糕的编程和逻辑错误吗?阻止我使用“this”,我发现这有时会使代码混乱。“其他框架”应该是对话框。。如果你关注@dic19添加的链接,你会发现这一点已经被讨论过了。只是试着理解代码。所以我应该扩展JFrame,但不使用我自己的局部变量?不,如果不添加任何与Swing相关的特性,就不应该从JFrame扩展。组合比继承更受欢迎。只需使用局部变量@DominickOk如果我删除局部变量并扩展JFrame,我仍然有同样的问题。如何在父帧中创建新帧,然后处理该帧,但子帧仍保持活动状态。控件是否传递给子框架?扩展JFrame很好——使用变量还是扩展类更好取决于您将如何使用它。我没有这样做;我怀疑,如果你在孩子身上调用setVisible,然后处理掉父母,然后在按下孩子按钮时反转这个顺序,那么你就会得到你想要的。如果你没有,调试它,并发布一个关于任何困惑你的问题。
    import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class childFrame extends JFrame {

    private JFrame frame; 
    private JButton button;

    public childFrame() {
        frame = new JFrame("Child Frame");
        frame.setSize(400, 400);
        button = new JButton();
        frame.add(button);
        button.addActionListener(new buttonPress());
        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void createParent() {
        parentFrame pF = new parentFrame(); //The default constructor will display the frame
        frame.dispose(); //How?
    }

    class buttonPress implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            createParent();
        }
    }

}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);