我想澄清一下这里到底发生了什么。说我有这三种方法,我不断地一次又一次地按下按钮。这是否会导致我不知道某种内存泄漏或指针链?我的理解是,当一个方法结束时,清除该方法的局部变量。这会包括新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();
}
}
}
答案 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教程,并确保在深入了解之前了解类和实例。手动启动将帮助您更好地理解(我看到他们已经告诉过您,但我同意)。继续!