2015-01-21 2 views
2

Я хотел бы получить некоторую ясность относительно того, что здесь происходит. Скажем, у меня есть эти три метода, и я постоянно нажимаю кнопку снова и снова. Является ли это причиной какой-то утечки памяти или цепочки указателей, о которых я не знаю? Я понимаю, что когда метод заканчивается, все переменные, локальные для этого метода, очищаются. Это будет включать в себя, что «указатель» на новый 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(); 
     } 
    } 

} 
+3

Примечание: ваш класс ParentFrame распространяется от 'JFrame', но вы используете переменную класса с именем' frame' для отображения фрейма и не располагаете никакими экземплярами ParentFrame. Вероятно, это вызывает утечку памяти (хотя и не полностью протестировано). Я бы просто удалил 'extends JFrame' из заголовка класса и вместо этого использовал локальные переменные.Кроме того: [Использование нескольких JFrames, хорошая/плохая практика?] (Http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice) – dic19

+0

Я использую фрейм, чтобы я не нужно вызывать super(), и у меня есть доступ к переменной фрейма. Это плохое программирование и логически неправильно? Не позволяет мне использовать «это», которое, как мне кажется, делает код иногда путаным. – Warsum

+3

«Другие рамки» должны быть диалоги. Если бы вы следовали за ссылкой, добавленной @ dic19, вы бы нашли это обсужденным. –

ответ

1

Я не уверен, что вы подразумеваете под "Я не должен назвать супер()", но если вы хотите избегайте путаницы, затем либо удлините JFrame или используйте переменную в вашем классе типа JFrame. У вас есть и то, и создайте ссылку на переменную в конструкторе, так что, когда выполняется JFrame frame = new parentFrame();, создаются два JFrames: тот, на котором у вас есть оператор new, и тот, что находится в конструкторе этого объекта.

Что касается очистки, когда вы выполняете setVisible(true); на JFrame, мне кажется очевидным, что ссылка JFrame помещается в систему Swing, поэтому переменная в вашем методе (будь то локальная или экземплярная (или статическая)) больше не является единственной ссылкой. Я думаю о dispose() как инструкция к структуре Swing, что код выполняется с этой переменной, очищается после него и удаляет все ссылки на нее. Если вы этого не сделаете, прежде чем потеряете свою собственную ссылку на переменную (например, если это была локальная переменная, и вы не сделали этого, прежде чем вы вышли из метода), вы потеряете возможность вызова dispose. Полагаю, вы все равно можете получить ссылку от Swing, а затем позвонить на нее.

Вы не говорите, есть ли у вас доказательства утечки памяти или просто пытаетесь понять этот код.

+0

Просто пытаюсь понять код. Поэтому я должен расширить JFrame, но не использовать собственные локальные переменные? – Warsum

+3

Нет, вы не должны распространяться на JFrame, если вы не добавите связанную с Swing функцию. Композиция очень предпочтительна по сравнению с наследованием. Просто используйте локальные переменные. @Dominick – dic19

+0

Хорошо, если я удалю свою локальную переменную и расширю JFrame, у меня все тот же вопрос. Как создать новый кадр в родительском кадре, а затем удалить этот кадр, но дочерний кадр остается в живых. Является ли управление передано дочернему кадру? – Warsum

0

Я прочитал ваш вопрос, ответы и комментарии. Я советую вам изучить основы ООП, чтобы лучше связывать ваши объекты. Оставить комментарий:

Как создать новый кадр в родительском кадре, а затем удалить его, но дочерний кадр остается в живых. Является ли управление передано дочернему кадру?

Каждый JFrame является независимым экземпляром объекта JFrame. Вам не нужно вручную передавать управление. Что вам нужно сделать, так это определить поведение закрытия для каждого JFrame: основной кадр на закрытии закрывает всю программу (EXIT_ON_CLOSE), вторичные кадры могут иметь другое поведение (HIDE_ON_CLOSE или DISPOSE_ON_CLOSE). Вы определяете это с:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

я советую вам пройти через Java-учебники и убедитесь, что вы хорошо понимаете, о классах и случаях перед погружением в колебание. Запуск вручную поможет вам лучше понять (я видел, что они уже говорили об этом, но я согласен с этим). Продолжай!

Смежные вопросы