actionListener problem.

Tags:    java

Jeg er igang med at læse Java 2 Grundbog, og er kommet til kapitlet om brugerinput.

den første Listener de beskriver er actionListener, og det er den jeg har problemer med, eller måske har det ivirkeligheden slet ikke noget med input at gøre, men handler bare om hvordan klasser snakker med hindanden...??

I de programmer de laver i bogen bruger de kun en klasse til både main funktionen, oprette vinduer, event listener osv. Jeg tror det er for at spare plads. Jeg har så valgt at lave flere forskellige klasser fordi jeg tror det er mere "rigtigt"

jeg er som sagt kommet til at lære om actionListener, her er mine filer:

layout.java:
Fold kodeboks ind/udJava kode 


vindue.java
Fold kodeboks ind/udJava kode 


lytter.java
Fold kodeboks ind/udJava kode 


måske var al den kode ikke nødvendig, men nu fik i den for en sikkerheds skyld :D håber ikke den forvire.

Problemet ligger i lytter.java i linien v.setTitle("Du har trykket ok")

den kan ikke finde v objektet.

Det kan godt være at jeg har sat klasserne op på en helt fucked måde... håber i kan hjælpe:D



Indlæg senest redigeret d. 06.06.2008 11:29 af Bruger #13669
9 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
næh det kunne jeg heller ikke, men det ville utvivlsomt virke.

men der er vel reelt kun tre måder at bygge det på
-hvis lytteren nedarver vinduet <-var mit forslag
-hvis lytteren har et object af vindue som member

og den sidste lidt sorte
- et object af vindue og et object af lytteren får givet hinanden gennem i main.

kunne se nogenlunde sådan her ud
lytter l=new Lytter();
vindue v=new vindue(l);
l.setVindue(v);




Jeg har lige tjekkets Suns egen javatutorial ud for at finde en mulig løsning, du kan bruge samme struktur i programmet ved at sende vinduet til lytter-klassen i lytter-klassens konstruktør, din lytter.java skal så se således ud:

Fold kodeboks ind/udJava kode 


og når du opretter et objekt af lytterklassen i dit vindue, skal du så sende vindues-objektet selv med this således (vindue.java linje 18):

Fold kodeboks ind/udJava kode 


Jeg har selv lige testet at det virker som det skal.

Om du bruger en decideret lytter-klasse til eventhandling eller du bruger vinduet selv er nok ligemeget, personligt ville jeg nok lade det komme an på projektets størrelse og antallet af events du skal håndtere.

citat fra Suns java tutorial:
You have many choices on how to implement an event listener. We can not recommend a specific approach because one solution would not suit all situations. However, we can give you some hints and show you some techniques that you might see, even if you do not use the same solution in your program.

For example, you might choose to implement separate classes for different kinds of event listeners. This can be an easy architecture to maintain, but many classes can also mean reduced performance.




Din lytterklasse har ikke adgang til objektet v (dit vindue) fordi det er en privat variabel der tilhører layout-klassen.



For at kunne få adgang til at ændre i dit vinduesobjekt skal ActionListeneren have adgang til det. De to muligheder jeg umiddelbart kan se er:

1. Du bruger objektet (vinduet) selv som Actionlistener sådan som det sikkert også er gjort i din bog.

2. Du laver din lytter-klasse som et nested (indre) objekt så det burde få adgang til vinduets variabler.

Jeg er ikke ekspert på området, så der kan være flere muligheder. Jeg tror ikke at det gør nogen synderligt stor forskel at lige nøjagtig din ActionListener kommer i en klasse for sig, for du får sikkert ikke brug for den uden for vinduesklassen.



lidt underligt forslag men han kunne vel egentlig lade lytter extends vindue, så skal han bare lige huske at sætte actionlistener for knap1 i lytters constructor og lade knap1 være et member i vindue.



nu har jeg lagt actionPerformed metoden ind i vindue klassen, og det virker.

Er det den mest optimale måde at gøre det på?



Nørden jeg kan ikke se hvordan det skulle gavne at lave en klasse der arver fra vinduesklassen med den ekstra metode, frem for at lave vinduesklassen med metoden fra starten af.

Andreas jeg tror umiddelbart der er andre måder at gøre det på end de to jeg nævnte tidligere, jeg prøvede at google det i går aftes, og der fandt jeg ikke andre måder at gøre det på. Jeg tror alligevel at det vil være yderst sjældent at du har brug for en actionlistener der gør det samme for flere forskellige vinduesklasser.



men mådan man normalt ville gøre det på var at ligge Listeneren inde i vindue classen??



NICE det er da enormt smart!

Tak for svarene :D



t