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, botów: 0