Nasłuchiwanie jbutton

0

Witam!

Opis problemu: Mam dwie klasy:gui i logikę. Załóżmy że że to prosty kalkulator(nie jest to jakoś szczególnie istotne). Klasa gui ma jakiś jtextfield i jbutton. Klasa Gui ponadto ma zmienna boolean czyKliknietoJButton(na początku ustawione na false). Gdy klikniemy w jbutton zmienna czyKliknietoJButton zmienia wartosc na true. Klasa logika ma referencje na obiekty klasy Gui. Teraz chciałbym wykonać w klasie logika taki kawałek kodu

 if(button.isCzyKliknietoJButton==true)
System.out.println("wcisnieto guzik")

Problem w tym że wartość zmiennej boolean dla klasy logika ma zawsze wartość false(czyli domyślnie ustawioną), podczas gdy dla klasy GUI po kliknięciu zmienia się ta wartość na true. Jak rozwiązać ten problem(Zapewne jakimś ActionListenerem, ale nie mam pojęcia co z nim zrobić)?

0

Nie nie nie! Swing umożliwia pracę ZDARZENIOWĄ! Nie robi się tego na zasadzie "if kliknięto button"! Bo jak to u ciebie wygląda? Sprawdzasz to w jakiejś pętli? To już jest zaimplementowane w javie!
W action listenerze podajesz AKCJĘ która się ma wykonać jak ktoś kliknie!

button.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent ev){
  System.out.println("wcisnieto guzik");
}
});
0

OK, i tak robię w klasie GUI
private boolean czyKliknięto=false;
....
button.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent ev){
System.out.println("wcisnieto guzik");
czyKliknięto=true;
}
});

, ale mi bardziej chodzi o wartość pola boolean w klasie logika (widzi wartość false z deklaracji ` private boolean czyKliknięto=false;`)
a chciałbym żeby ta aktualna wartość była widziana w także w klasie logika
1

Robisz to źle. Ten pomysł z booleanem na pewno jest ZŁY i mogę to stwierdzić nie widząc nawet tej twojej logiki... No ale skoro wiesz lepiej:
Jak tą wartość do klasy logika przekazałeś? Bo jeśli przekazałeś tam jakiegoś booleana to nie dziwota ze nie zmienił on wartości, bo to będą dwa różne prymitywy. Powinieneś w klasie Logika mieć referencje do GUI i robić jakieś gui.getButtonStatus(), albo ewentualnie zrobić klasę opakowującą tego twojego booleana, referencje do obiektu tej klasy (np. niech się nazywa opakowanie()) przekazać do logiki a w gui robić opakowanie.setTrue() / opakowanie.setFalse() i wtedy w obu miejscach masz referencje do tego samego obiektu.

0

Nie unoś się:). Otóż przekazuję w konstruktorze logika referencję do klasy GUI, w której dodalem metodę zwróćCzyKliknięto

0

Dla ułatwienia weźmy przykładowe klasy
klasa g:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class g extends JFrame {

        private JPanel contentPane;
        private boolean tak;
        private l qq;

        public g(l aa) {
                qq=aa;
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setBounds(100, 100, 450, 300);
                contentPane = new JPanel();
                contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
                setContentPane(contentPane);
                contentPane.setLayout(null);
               
                JButton button = new JButton("New button");
                button.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                tak=true;
                                System.out.println("g:"+tak);
                        }
                });
                button.setBounds(77, 118, 89, 23);
                contentPane.add(button);
                this.setVisible(true);
        }

        public boolean isTak() {
                return tak;
        }

        public void setTak(boolean tak) {
                this.tak = tak;
        }
       
} 

klasa l:

public class l {

        private g ga;
        public l()
        {
                ga=new g(this);
                if(ga.isTak()==true)
                System.out.println("działa");
        }
        public static void main(String [] args)
        {
        l ll=new l();
        }
}

 

I teraz chcę żeby wykonało się to co jest w warunku
if(ga.isTak()==true)

0

Ja ci nie zabraniam, zresztą nie widzę w czym jest problem - przekaż do l referencje na g i już (swoją drogą gratulacje za umiejętne nazywanie klas, widzę przed tobą wielką przyszłość...). Ale to nadal jest po prostu bez sensu.

0

Faktycznie kod był pisany na szybko stąd takie nazwy klas-sorry za to. Mała modyfikacja kodu klasy l

 public class l {
 
        private g ga;
        public action()
        {
                ga=new g(this);
                if(ga.isTak()==true)
                System.out.println("działa");
        }
        
        }
}

Klasa l jest uruchamiana w ramach frameworku. Czyli aby wartość ga.isTak()==true to możemy napisać słuchacza który nasłuchuje czy zmieniła się w klasie g wartość tak. Ale za bardzo nie mam pomysłu jak to zrobić.

0

Jakiego znów słuchacza? Tej zmiennej w ogóle nie powinno tam być. Wykonanie akcji buttona powinno wywołać jakąś reakcję i tyle! Chyba ze chcesz żeby to bylo asynchroniczne? Napisz PO CO ci to to moze coś się wymyśli. Bo niestety póki co wygląda to jak sen paranoika.

0

OK, jeszcze raz i pooli. Dane są dwie klasy g i l(wersja ostatnia). Klasa l napisana jest zgodnie z danym frameworkiem i ona jest uruchamiana. Klasa g to gui zawierający przycisk. Po naciśnięciu tego przycisku w klasie l ma wykonać się kawałek kodu System.out.println("działa"); który oznacza ze przycisk został naciśnięty. Mój problem polega na tym że nie wiem jak przekazać klasie l informację o tym że został naciśnięty przycisk z klasy g (w klasie l nie mogę stworzyć konstruktora innego niż domyślny ponieważ klasa l nie będzie się kompilować). Stąd trudność. Czy teraz jaśniej?

0

Nie, bo ja w ogóle nie widzę związku żadnego. Czemu?
Przecież to klasa g potrzebuje referencję na klasę l więc pojęcia nie mam co ci konstruktor klasy l przeszkadza.
Zróbże jak człowiek w klasie l metodę:

class l{
  public void metodaZDupy(){
    System.out.println("nie umiem podstaw, a próbuje pisać programy"); 
  }
}

Następnie w miejscu gdzie tworzysz obiekt klasy g przekaż mu referencję do obiektu klasy l (nie obchodzi mnie jak, mozesz to wstrzyknąć springiem, mozesz wrzucić mu w konstruktor, możesz pociagnąć z service locatora, mozesz mieć jakiś singleton, albo wymyśl sobie jeszcze coś innego), a następnie w klasie g zrób action listenera który w akcji naciśnięcia guzika zrobi:

referencjaDoObiektuLKtoraJakosZdobylem.metodaZDupy();

i voila wszystko śmiga.

0

Ok, dzięki. Ogarnąłem to wreszcie i fakt bezsensu pisałem. Jeszcze raz dzięki za pomoc!

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