Java Swing JFrame配置方法

时间:2015-01-21 15:10:23

标签: java swing pointers memory jframe

我想澄清一下这里到底发生了什么。说我有这三种方法,我不断地一次又一次地按下按钮。这是否会导致我不知道某种内存泄漏或指针链?我的理解是,当一个方法结束时,清除该方法的局部变量。这会包括新JFrame的“指针”然后更正吗?

再次假设用户正在点击每个框架上的按钮。

    public class driver {


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

-

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class parentFrame extends JFrame {

    private JFrame frame; 
    private JButton button;

    public parentFrame() {
        frame = new JFrame("Parent 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 createChild() {
        @SuppressWarnings("unused")
        childFrame cF = new childFrame(); //The default constructor will display the frame
        frame.dispose(); //How?
    }

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

}

-

    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();
        }
    }

}

2 个答案:

答案 0 :(得分:1)

我不确定你的意思"我不必打电话给super()",但是如果你想避免混淆,那么要么 extend JFrame 使用JFrame类型的变量。你有两个,并在构造函数中创建变量引用,以便在执行JFrame frame = new parentFrame();时,创建两个JFrame:你有new运算符的那个,以及构造函数中的一个那个对象。

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

您不会说您是否有内存泄漏的证据,或者只是想了解此代码。

答案 1 :(得分:0)

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

  

如何在parentFrame中创建一个新Frame然后处理该帧,但子帧仍然存活。控件是否传递给子框架?

每个JFrame都是JFrame对象的独立实例。您无需手动传递控件。您应该做的是为每个JFrame定义关闭行为:关闭时的主框架将关闭整个程序(EXIT_ON_CLOSE),辅助框架可以具有其他行为(HIDE_ON_CLOSE或DISPOSE_ON_CLOSE)。您可以使用以下方法定义:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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