Kommunikation mellan GUI och "grundklass" i Java?

Permalänk
Medlem

Kommunikation mellan GUI och "grundklass" i Java?

Hej allihopa.

Jag har knåpat ihop en klass som gör diverse uträkningar och lite kul och har gjort ett GUI för att grafiskt visa vad som händer. Så långt inga problem.

Klassen ifråga uppdaterar GUI:t via ett interface.

Men nu är det så att jag vill ha en knapp i GUI:t som det står typ "börja om" på. Hur gör jag snyggast nu så att själva räknarklassen får veta att den ska göra det som så att säga "GUI:t vill"?

Alltså: Nu är det ju så att bara "räknarklassen" säger åt GUI:t vad det ska göra, men nu vill jag alltså göra tvärt om... Hur?

Mvh Daniel

Permalänk

Jag vet inte om jag riktigt förstår ditt problem, men är det inte bara att du gör en metod i räknarklassen, ex. "startaOm()", som du kallar på från GUI-klassen? Har för mig att det åtminstone med Swing är lite klurigt att få en klass att ändra något i GUI:t, men det klurar du nog ut.

Visa signatur

System.out.print(madness ? this.is.SPARTA : "");

Permalänk
Medlem

Men GUI-klassen har ingen instans av räknarklassen. Så den kan ju inte anropa den på det sättet, vad jag förstår iallafall...

Nu är jag ju ingen expert på detta, utan sitter och försöker lära mig hur det funkar.

Räknarklassen har en instans av GUI:klassen, via ett interface och kommunicierar på det sättet med GUI-klassen. Men åt andra hållet vet jag inte hur jag skall göra.

Det räknarklassen får är ju diverse returvärden från anropen till GUI:t, Men om man vill ha tillbaka resultatet av ett eventuellt knapptryck måste ju räknarklassen hela tiden sitta och vänta på dessa returvärden. Kanske går att lösa med trådar, men finns det något enklare sätt?

Ett till interface som räknarklassen implementerar kanske? Eller blir det bara konstigt?

Är jag ute och cyklar här?

Permalänk

Jag förstår inte heller riktigt hur du har gjort och hur du har tänkt...

Men har du inte gjort det bakvänt? Du skriver:

- "Men GUI-klassen har ingen instans av räknarklassen."
- "Räknarklassen har en instans av GUI:klassen"

Det är nog GUI-klassen som ska vara 'main-klass' och då innehålla en instans av 'räknar-klassen' och inte tvärtom!

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk
Medlem

Jo, kanske det...

Jag ville ha GUI:t så fristående som möjligt liksom.

Jag ville att programmet skullel kunna köras helt utan GUI:t också, det ska bara vara ett "skal" som visar det grafiskt.

Jag gjorde först programmet så det skrev ut alla resultat i textpromten, men sen byggde på GUI:t.

Är det inte rätt tänkt eller?

Permalänk
Citat:

Ursprungligen inskrivet av DanielF
Jo, kanske det...

Jag ville ha GUI:t så fristående som möjligt liksom.

Jag ville att programmet skullel kunna köras helt utan GUI:t också, det ska bara vara ett "skal" som visar det grafiskt.

Jag gjorde först programmet så det skrev ut alla resultat i textpromten, men sen byggde på GUI:t.

Är det inte rätt tänkt eller?

All funktionalitet som du vill att dit program ska göra(räkna?) sätter du i räknar-klassen. Sedan skapar du publika metoder för att accessera data, beräkna data osv.

GUI-klassen ska endast ansvara för det grafiska, dvs. Buttons osv. Vill du att ha en non-GUI application, skapar du en non-GUI version som använder samma räknar-klass, men lägger ut resultatet t.ex. via System.out.println().

På detta sätt blir det precis som du vill: GUI:et blir endast ett skal som visar det grafiska.

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk
Medlem

Du har nog rätt.

Jag har nog tänkt bakvänt som tidigare nämnts... (+ att jag ville mixtra med interface)

Men då skall jag ändra och se om jag kan sno runt tankegångarna lite, återkommer med resultat.

Tack för svaren.

/Daniel

Permalänk

Tankegångarna kan du säkert återanvända.

Egentligen interfacet i det här fallet blir ju dina publika metoder i räknarklassen. Det är det enda som GUI:et ser och är medveten om och kan använda. Därför kan du göra vilka förändringar/förbättringar(t.ex. effektivare algoritm för lösningen på ett räknar-problem) som helst i räknarklassen så länge som du inte ändrar metodens namn samt argumentlist.

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk
Medlem

Man kan även skicka event mellan objekten. Då får man klasserna helt fristående från varandra. Det är då ytterst lätt att byta GUI, bara skapa ett nytt och se till så det kan hantera alla event.

T.ex. så kan man ha en main klass som innehåller ett GUI objekt och ett Räkneobjekt. Sen kopplar man ihop dessa två objekt genom att t.ex. låta dom lyssna på varandra.

Permalänk

Vad vinner man på det? Som jag fattar det så blir inte klasserna mera fristående för det. En av klasserna(GUI:et) fungerar väl ändå som client?

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk
Medlem

Det man vinner är att ingen av klasserna behöver veta något om den andra klassen, det enda de behöver veta är vilka event de ska kunna hantera. Vilket resulterar i att ingen av klasserna innehåller ett objekt av den andra klassen, de "hänger" alltså inte ihop. Dock så får man en till klass som kopplar samman dem.

Om det är rätt vet jag inte, men det fungerar bra för mig.

Permalänk
Medlem

Hej igen. Nu börjar jag få till det som jag vill. Gjorde som Turbo_tail sa och gjorde "omvänt" det jag gjort från början...

Nu har lite nya problem dykt upp, men inget som jag (hoppas jag) behöver ta upp här.
Jag kämpar på...

Tack igen för hälpen.

Mvh Daniel.

Permalänk
Citat:

Ursprungligen inskrivet av Tossen
Det man vinner är att ingen av klasserna behöver veta något om den andra klassen, det enda de behöver veta är vilka event de ska kunna hantera. Vilket resulterar i att ingen av klasserna innehåller ett objekt av den andra klassen, de "hänger" alltså inte ihop. Dock så får man en till klass som kopplar samman dem.

Om det är rätt vet jag inte, men det fungerar bra för mig.

Ahh. Ok. Låter annorlunda.. Har du något litet enkelt exempel på detta? Skulle vara skoj att se hur det fungerar i praktiken.

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk
Medlem

Hehe, jo det är nog lite udda. Har bara testat det lite så jag har tyvär ingen bra exempelkod att visa, men om jag gör en kort förklaring här nedan så kanske du kan knåpa ihop något själv

Koden nedan ska ej ses som någon färdig kod då den bara är till för att det ska bli lättare att förklara.

class MainClass { private GUIClass gui; private DoSomethingClass do; //Ska implementera ActionListener public MainClass() { gui = new GUIClass(); do = new DoSomethingClass(); gui.addActionListener(do); } //sen är det bara att starta allt. }

GUIClass ska ha funktioner för att lägga till och ta bort actionlistener. Så när t.ex. någon trycker på en knapp så skickar GUIClass en ActionEvent till sin ActionListener, vilken är do objektet i det här fallet

Jag kanske gör något exempel senare.