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

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.

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.

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.

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