Dlaczego nie mogę odczytać metody?

0

cześć
Mam klasę MyFrame, w której jest metoda getZmienna() zwracająca zmienną "zapisywanie". Chciałbym odczytać tą zmienną w klasie Zapis. Mam taki problem, że tak klasa w ogóle się nie wykonuje bo nie jest dodana do MyFrame, a (chyba) musi byc tam dodana bo MyFrame jest dodane do głównej metody programu.
Nie wiem jak lepiej opisać problem, może lepiej pokażę klasy.
Metoda główna:

public class Test {
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyFrame();
            }
        });
    }
}

Po użyciu menu zapisz zmienna zapisywanie ma zmienić wartość, która zostanie odczytana w klasie Zapis, tam przekazana do if i wykona się zapis do pliku

public class MyFrame extends JFrame implements ActionListener {
 
    PrawyPanel prawyPanel= new PrawyPanel();
    LewyPanel lewyPanel=new LewyPanel(prawyPanel);
    MyFrame ramka = new MyFrame();
 
 
    JScrollPane przewijanie = new JScrollPane(lewyPanel);
 
    JMenuBar menu = new JMenuBar();
    JMenu menuPlik;
    JMenuItem mOtwórz,mZapisz;
 
    int zapisywanie;
 
    public MyFrame(){
        super("Hello World");
 
        try{
            Zapis zapis = new Zapis(lewyPanel,ramka);
            }
            catch(IOException wyjatek){
                System.out.println("błąd IOE");
            }
 
        menuPlik = new JMenu("Plik");
        mZapisz=new JMenuItem("zapisz");
        mOtwórz=new JMenuItem("otwórz");
 
        menuPlik.add(mZapisz);
        mZapisz.addActionListener(this);
        menuPlik.add(mOtwórz);
 
        setJMenuBar(menu);
        menu.add(menuPlik);
 
        przewijanie.setPreferredSize(new Dimension(1050,750));
 
        JPanel panelGlowny = new JPanel(); //panel główny
        panelGlowny.setLayout(new FlowLayout());
 
        panelGlowny.add(przewijanie);
        panelGlowny.add(prawyPanel);
 
        setContentPane(panelGlowny);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(1400, 800);
        setLocation(30,50);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent e){
        Object source = e.getSource();
 
        if(source==mZapisz){
            zapisywanie=1;
        }
    }
    public int getZmienna(){
        return zapisywanie;
    }
    }

klasa, która będzie zapisywać dane z lewego panelu do pliku

public class Zapis  {
    LewyPanel lewy = null;
    MyFrame ramka = null;
 
    public Zapis(LewyPanel lewy, MyFrame ramka)throws IOException{
        this.lewy=lewy;
        this.ramka=ramka;
        PrintWriter zapis = new PrintWriter("zapis.txt");
 
 
        if(ramka.getZmienna()==1){
        System.out.println("działa");
        }
 
    }
    }

kod w takiej postaci się kompiluje, ale po uruchomieniu programu rokienko się nie pokazuje, program coś robi (jak by jakąś pętlę w nieskończoność). Gdy usunę linijkę

MyFrame ramka = new MyFrame();

z klasy Zapis program działa, działa też jeśli usunę blok wyjątku z klasy MyFrame, ale gdy zrobię którąś z tych rzeczy tracę dostęp do danych.
Chyba trochę za bardzo namieszałem i nie mogę sobie z tym poradzić :P Proszę o pomoc

0

Pozbądź się

MyFrame ramka = new MyFrame();

Tak jak jest teraz MyFrame tworzy kolejnego MyFrame, a ten tworzy kolejnego itd.

Zapis zapis = new Zapis(lewyPanel,ramka);

Zamiast "ramka" daj "this".

Ogólnie musisz zmienić kod bo w postaci takiej jak jest teraz zmienna zapisywanie jest sprawdzana podczas tworzenia obiektu klasy Zapis, a to się dzieje tylko raz na samym początku gdy tworzysz obiekt klasy MyFrame.

0

masz rację w obydwóch sprawach, zmieniłem tak jak tu podałeś i program się uruchomił jak należy, a zmienna jest sprawdzana tylko raz

nie wiem czy mądrze zrobiłem ale, przeniosłem całą obsługę wyjątku tworzenia obiektu zapis do metody ActionPerformed i już odczytuję zmienną po kliknięciu
teraz pojawił się taki problem, że odczytuję zmienną dopiero po drugim kliknięciu przycisku, ale może w końcu zmienię tak jak trzeba

dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1