Различные JFrames в программе - PullRequest
1 голос
/ 08 ноября 2019

В программе я хочу открыть много кадров при нажатии кнопки. каждый раз, когда я нажимаю кнопку, я создаю экземпляр фрейма и делаю его видимым с помощью метода «setVisible», но каждый раз, когда я нажимаю кнопку, фреймы генерируются экспоненциально.

То есть, если у меня есть 2 открытых кадра и я нажимаю кнопку, открываются еще 4, и если я нажимаю ее снова, они открывают 8 и т. Д.

Вот мои коды

public class ex {

    public static void main(String[] args) {

        frame fr = new frame ();
        fr.setVisible(true);

    }

}

public class frame extends JFrame{

    static int i=1;
    static JButton bt1 = new JButton("Next");

    public frame () {
        super ("Example"+i);
        setSize(600,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocation(400,200);
        setResizable(false);
        setLayout(new GridLayout(2,1));

        JLabel et1 = new JLabel("frame"+i);

        this.add(et1);
        this.add(bt1);

        AL actionListener = new AL ();
        bt1.addActionListener(actionListener);

    }
}

import java.awt.event.*;

public class AL implements ActionListener{

    public void actionPerformed (ActionEvent e) {

        if(e.getSource()==frame.bt1) {
            frame.i++;
            frame fr = new frame ();
            fr.setVisible(true);
        }
    }
}

1 Ответ

1 голос
/ 08 ноября 2019

Проблема здесь в том, что мы используем статический модификатор для bt1. Используя ключевое слово static, мы создаем новую кнопку при первом вызове конструктора frame. При каждом последующем вызове конструктора frame создается новая кнопка , а не . Скорее ключевое слово static вызывает создание кнопки только один раз при первом вызове.

Каждый раз, когда вы создаете новый JFrame, он фактически использует одинаковую кнопку для каждого из JFrame. Это, в свою очередь, может вызвать поведение, которое вы видите.

Когда вы создаете свой первый кадр, к нему прикрепляется bt1. При нажатии кнопки «Далее» будет создан второй кадр с прикрепленным к нему таким же bt1. Что еще более важно, когда вы вызвали этот конструктор, вы создали новый ActionListener и прикрепили его к той же кнопке . Поэтому каждый раз, когда вы вызываете этот конструктор, вы будете добавлять другого слушателя к тому же объекту кнопки, который используется во всех кадрах.

Корень проблемы в том, что с каждым конструктороммы добавляем новый ActionListener к той же кнопке.

Я полагаю, что вы можете решить эту проблему одним из двух способов.

  1. Сделать bt1 нестатичным, чтобы у каждого объекта кадра была своя уникальная кнопка
  2. Makeваш actionListener в конструкторе фреймов статический. В этом случае все кадры будут использовать одну и ту же кнопку. И все кнопки будут использовать один и тот же (и единственный) actionListener.
...