Я хотел бы получить некоторую ясность относительно того, что здесь происходит. Скажем, у меня есть эти три метода, и я постоянно нажимаю кнопку снова и снова. Является ли это причиной какой-то утечки памяти или цепочки указателей, о которых я не знаю? Я понимаю, что когда метод заканчивается, все переменные, локальные для этого метода, очищаются. Это будет включать в себя, что «указатель» на новый JFrame затем исправит?Java Swing 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();
}
}
}
Примечание: ваш класс ParentFrame распространяется от 'JFrame', но вы используете переменную класса с именем' frame' для отображения фрейма и не располагаете никакими экземплярами ParentFrame. Вероятно, это вызывает утечку памяти (хотя и не полностью протестировано). Я бы просто удалил 'extends JFrame' из заголовка класса и вместо этого использовал локальные переменные.Кроме того: [Использование нескольких JFrames, хорошая/плохая практика?] (Http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice) – dic19
Я использую фрейм, чтобы я не нужно вызывать super(), и у меня есть доступ к переменной фрейма. Это плохое программирование и логически неправильно? Не позволяет мне использовать «это», которое, как мне кажется, делает код иногда путаным. – Warsum
«Другие рамки» должны быть диалоги. Если бы вы следовали за ссылкой, добавленной @ dic19, вы бы нашли это обсужденным. –