Listener do wykrywania zmiany wartośći zmienny

0

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.

0

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.

0

PropertyChangeListener, do rozsyłania i podpinania listenerów użyj PropertyChangeSupport.

0

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 :)

0

Logika i widok zwykle jednak powinny oddzielone.

0

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.

0

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.

0

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));
        


    }

0

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.

0

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.

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