Mam dwie klasy. Pierwsza odpowiada za okno programu, z komponentami takimi jak jTextField itd. W drugiej klasie zachodzą pewne obliczenia w czasie. Jaki listener użyć(napisać) aby wykrywał zmianę wartości zmiennej w 2 klasie i od razu uaktualniał wartość jTextField, który wyświetla wartość tej zmiennej.
Nie lepiej użyć klasy wewnętrznej ? W polach tej nadrzędnej daj te JText i wtedy będziesz mieć z wewnętrznej do nich dostęp bez pisania osobnej klasy.
PropertyChangeListener, do rozsyłania i podpinania listenerów użyj PropertyChangeSupport.
wg mnie nie potrzebujesz kolejnej klasy - zresztą (o ile dobrze rozumuję nie znając javy) nie potrzeba w ogóle wewnątrz aplikacji takich rozwiązań - wystarczy przekazywanie parametrów, oparcie o te same zapytania itp :) a jeśli dowiem się, że każde rozwiązanie w javie poczynając od okna, a na połączeniu z DB kończąc trzeba rozwiązać w oparciu o nowe klasy, to się w końcu przekonam, że nie warto uczyć się innych języków programowania poza pascalem :)
Logika i widok zwykle jednak powinny oddzielone.
Problem autora to modelowy przypadek, w którym narzuca się skorzystanie ze wzorca Obserwator: http://en.wikipedia.org/wiki/Observer_pattern
W Javie wystarczy użyć klas o których napisał ehm.
Może opisze moje klasy dokładniej, bo mam jeszcze pytanie. Program pisze w Netbeans: klasa1 to klasa okna dziedzicząca po (JFrame) w której jest kod generowany przez netbeans dotyczący komponentów. Klasa1 zawiera też oczywiście funkcję main z eventqueue. Klasa2 to klasa napisana przeze mnie, dziedzicząca po JPanel. Służy ona do rysowania na panelu który jest dodany także jako komponent do głównego okna (klasa1). W klasie2 jest wywołany timer, który co pewien czas powoduje zmiany wartości zmiennej. Efekt docelowym jest to, aby w klasie1 w dodanym tam JTextField w trakcie działania programu na bieżąco zmieniała się wartość zmiennej z klasy2. W klasie1 implementuje interfejs PropertyChangeListener, dodaje pole PropertyChangeSupport, jednak mam problem jak powiązać to ze zmienną z klasy2 która ma być wyświetlana na bieżąco w JTextField jak jej wartość ulega zmianie.
Mogę zrobić coś takiego ale nie wiem, na ile jest to poprawne wyjście z sytuacji, dlatego pytam wyżej o listenery:
Domyślnie komponent JTextField w klasie1 dodany kreatorem na JFrame ma taką deklarację:
private javax.swing.JTextField jTextField1;
W tym wypadku nie mogę napisać żadnej niestatycznej funkcji która zwracała by JTextField, bo na rzecz jakiego obiektu miałby ją niby wywołać w klasie2 w actionperformed (od timera) ?
Jeśli natomiast JTextField uczyniłbym statycznym obiektem:
private static javax.swing.JTextField jTextField1;
wtedy mógłbym napisać taką funkcję w klasie1:
public static JTextField getJTF()
{
return jTextField1;
}
i następnie użyć jej tak w actionperformed w klasie2:
public void actionPerformed(ActionEvent e) {
//jakieś działania
repaint():
cycleCount++;
MainWindow.getJTF().setText(Integer.toString(cycleCount));
}
Możesz użyć java.util.Observer i Observable.
Widok implementujesz jako Observer, a w nim metoda update, która ustawia odpowiednią wartość pola tekstowego.
Model ma rozszerzać klasę Observable, łączysz go z widokiem przez wywołanie addObserver(...).
Jeśli w modelu zmieni się jakieś property to wywołujesz:
setChanged();
notifyObservers();
i widok zostanie powiadomiony o zmianie w modelu poprzez wywołanie metody update.
http://download.oracle.com/javase/tutorial/javabeans/properties/bound.html
Tu jest mały przykład jak posłużyć się klasami PropertyChange*****
Ewentualnie Observer i Observable tak jak napisał kolega powyżej.