Java swing jak przekazywać wartości zmiennych pomiędzy Action Listenerami

Odpowiedz Nowy wątek
2019-07-11 20:23
0

Witam. Mam problem, który chyba tyczy się przekazywania zmiennych pomiędzy Action Listenerami dla jednej klasy. Jeśli np. chcę wprowadzić tekst z pliku do pola, to nie ma problemu. Ten tekst przez JTextField będzie dostępny dla innych Action Listenerów i dla klasy w której uruchamia się okno:

public class getFileListener implements ActionListener {

    private JTextArea JTextInput;

public getFileListener(JTextArea JTextInput) 
{
    this.JTextInput = JTextInput;   
}
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        JFileChooser jGet = new JFileChooser();
        if(jGet.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) //jeśli wybierzemy juz jakis plik
        {

            File file = jGet.getSelectedFile();
            try {
                JTextInput.setText(null);
                Scanner scanner = new Scanner(file);                        
                while(scanner.hasNext()) 
                {
                    JTextInput.append(scanner.nextLine()+"\n");
                }
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
}

Natomiast jeśli bym chciał żeby tekst nie został zapisany w polu tekstowym, ale jako String, powiedzmy tak:

public class getFileListener implements ActionListener {

    private JTextArea JTextInput;
        private String s;

public getFileListener(JTextArea JTextInput, String s) 
{
    this.JTextInput = JTextInput;   
        this.s = s;
}
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        JFileChooser jGet = new JFileChooser();
        if(jGet.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) //jeśli wybierzemy juz jakis plik
        {

            File file = jGet.getSelectedFile();
            try {
                JTextInput.setText(null);
                Scanner scanner = new Scanner(file);                        
                while(scanner.hasNext()) 
                {
                    JTextInput.append(scanner.nextLine()+"\n");
                }
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
               s = JTextInput.getText();
        }        
    }
}

to String z tekstem nie będzie dostępny poza ActionListenerem. Próbowałem szukać trochę o tym i jedyna odpowiedź jaką na to znalazłem, to żeby eksportować te zmienne do tymczasowych plików. Jeśli tak to będę kombinował w tym kierunku, ale chciałbym się upewnić czy na pewno.

edytowany 2x, ostatnio: paranoise, 2019-07-11 20:25

Pozostało 580 znaków

2019-07-11 20:52
0

Przeważnie w Swingu i FXsie jest tak że kontrolki stanowią jeden widok (klasa kontroler z kontrolkami) i ten widok ma model. Dlatego w klasie w której masz te kontrolki, zamieść pole jakiejś klasy modelowej i będziesz z poziomu każdego listenera mógł się do niego odwołać. W JavaFX jest prościej bo tam są bindingi, w Swingu bindingów sam musisz pilność przez gety i sety.Pisząc w Swingu nigdy nie wydzielałem listenerów poza klasę z kontrolera, przeważnie było to niewygodne i niepraktyczne - lepsze były jakieś referencje do metod. W twoim przypadku podczas tworzenia listenera mógłbyś przekazywać instancje klasy modelu danych na której widok operuje.

warto dodać, XxxxxEvent zawiera referencję do kontrolki, która do wywołała. To tzreba (niestety) rzutować i wykorzystać - AnyKtokolwiek 2019-07-11 21:01

Pozostało 580 znaków

2019-07-11 21:05
1

Pisząc w Swingu nigdy nie wydzielałem listenerów poza klasę z kontrolera

Idę po pistolet...

eksportować te zmienne do tymczasowych plików

Nie no bez jaj. To co zrobiłeś nie działa bo Stringi są copy-on-write i nie da się zmienić wartości stringa bez zmiany referencji. Ale w ogóle robisz to bardzo dziwnie i niezbyt sensownie. Zrób sobie zestaw klas które przechowują "stan aplikacji" i to w tym stanie trzymaj informacje a do kontrolek UI tylko te dane wyciągaj z tegoż stanu. W ogóle dzięki temu logika aplikacji oraz UI zostają rozdzielone. Bo logika aplikacji będzie właśnie związana z tym stanem i będzie zupełnie niezależna od tego jaki masz tam UI. Absolutnie nie przechowuj stany aplikacji w komponentach UI, bo ani to wygodne, ani testowalne ani rozszerzalne.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2019-07-11 21:06
Dąłem Ci kciuka. Dodajmy, że jasna chol... mnie bierze, że młodzi programiści googlają za identycznym rozwiązaniem, a nie potrafią swojej idei [b]podzielić[/b] np a) odczytaj z bazy b) wynik przechowaj w zmiennej (dzisiejszy wątek z delphi - rozumiem programiści tego języka konceptu zmiennej nie posiadają, tylko komponenty wizualne) - AnyKtokolwiek 2019-07-11 21:30

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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