Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 1279
Hei (igjen). Sitter å skriver et lite program i Java, da jeg er ferdig med de øvelsene det er lagt opp til via skolen, men jeg likevel ønsker å øve samt prøve ut nye funksjoner. I mangel av bedre ideer, lager jeg et lite "hjelpeprogram" til SC2, med timers for å huske Injects/Creep-spread, samt kunne vise diverse info om de forskjellige enhetene. Men, jeg har litt problemer med å få alt til å virke på tvers av klassene. Problemene jeg har for øyeblikket er som følger:
  • Jeg greier ikke å lese ut info om enhetene fra arrayet, på tross av at innlesingen fra tekstfilen skal fungere (det virker slik ut fra foreløpig testing)
  • For øyeblikket bruker jeg anonyme actionlistenere, da jeg ikke fikk det til å fungere på andre måter jeg har lest om. Regner med det må finnes en bedre (og kortere kodemessig) måte å gjøre dette på? Ved event.getSource() el. noe lignende?
  • Jeg kunne også tenkt meg at om en av timerne er aktive, og det byttes fane, så skal den stoppes. Vil anta at det er mulig (actionlistener?) at dette kan gjøres ved å sjekke om Focus mistes eller noe sånt?

Ellers tar jeg i mot alle tips som kan gjøre koden mer leselig, eller andre ting som kan gjøres på en bedre måte! Legger kun ved javafilen, da resten var for stort til å lastes opp her. Så det vil komme feilmelding på noen få bilder, lyder og en tekstfil som mangler...
Sist endret av lroedal; 24. april 2013 kl. 00:30.
Har du mulighet for å dele i et annet format enn .rar? Foretrekker deling på web med syntax-highlight, sitter på jobb uten mulighet for å installere noe
Lim gjerne koden din inn her: http://pastebin.com/ - og del linken etterpå.
Trådstarter
Takk for tipset, kunne ikke legge den i code-tags her, da det rett og slett er for stort. :P

http://pastebin.com/vR6y9gZ4
Først av alt må jeg få si at jeg synes det var litt uoversiktlig kode. Forstår at du har samlet alle klassene i en "haug" for oss nå, men klassene dine er fortsatt vanskelige å lese. Foreslår at du leser deg litt opp på noen patterns, som for eksempel de nevnt i GRASP. For eksempel kan det være en god idé å separere logikk fra grafikk. Da blir det både mer oversiktlig, samtidig som koden din vil fungere uavhengig av hvordan du designer selve programmet grafisk.

Uansett, skal forsøke å svare på spørsmålene dine.
1. Klarer ikke helt å se hvor du prøver å lese fra arrayene dine, men du har deklarert variablene flere ganger, både utenfor main og i main (linje 11-13 og 102-104).

2. Anonyme lyttere er helt greit, blir ofte veldig rot. Husk at ActionListener er et interface som kan implementeres i alle klasser. Klasser kan ha konstruktører med parametre. Disse parametrene blir da referanser til objektet du oppgir under konstruksjon. La oss ta et konkret eksempel; btnTumorCounter-objektet ditt.

Her har du valgt anonym lytter, noe som i og for seg er helt greit. Videre kalles metoden "start()" på creepTimer-objektet. Dersom du skulle lagt en klasse av dette, kunne den sett slik ut:

Kode

public class TimerStartListener implements ActionListener {

    private Timer timer;

    public TimerStartListener (Timer timer) {
        this.timer = timer;
    }

    public void actionPerformed(ActionEvent e){
        timer.start();
    }
}
Veldig enkel klasse, men fordelen er nå at du kan bruke objekter av samme klasse flere steder, både til å starte creepTimeren og injectTimeren, da begge er av typen Timer. Kanskje enklere å forstå ved hjelp av kode.

Kode

TimerStartListener creepstart = new TimerStartListener(creepTimer);
btnTumorCounter.addActionListener(creepstart);

/*videre kode her..*/

TimerStartListener injectstart = new TimerStartListener(injectTimer);
btnInjectCounter.addActionListener(injectstart);
Fordelen med å gjøre det på denne måten, er at om du skal legge til ekstra sjekk, funksjonalitet etc før du starter timeren, gjøres dette kun nå i klassen TimerStartListener, og ikke flere steder i koden. Gjør det enklere å oppdatere kode, og mindre copy/paste.

3. Det skal være mulig å legge til lyttere når du skifter fane. I følge dokumentasjonen til JTabbedPane er det en metode som heter "addChangeListener". Da kan du bruke samme fremgangsmåte som i punkt 2, men klassen din implementerer ikke "ActionListener", men "ChangeListener".

Lykke til!
Sist endret av hosjmeister; 26. april 2013 kl. 18:28.
Trådstarter
Tusen takk for tilbakemelding! Hadde et lite "gjennombrudd" på skolen i dag, så kom videre med flere av problemstillingene jeg sto ovenfor. Problemet jeg hadde med arrayet var et amatørproblem (jeg prøvde flere forskjellige måter). Jeg hadde ikke laget metoder for å hente ut informasjonen i UnitArray-klassen, og i tillegg kalte jeg den feil (jeg prøvde å bruke klassen som et "array" (ved å gi posisjon), men siden UnitArray strengt tatt er et objekt, vil jo ikke dette fungere. Jeg er nødt til å gi den posisjonen som et parameter, for så å bruke den funksjonen jeg skrev til å hente informasjonen. Kan legge ut hvordan jeg gjorde dette om noen er interessert!

Fikk også til å skrive ActionListener som en separat klasse i dag (ikke spør hva jeg har gjort feil tidligere, jeg er ikke sikker selv), og har brukt denne til å sette opp deler av menyen. Skal lage noen flere klasser som implementerer ActionListener, slik at det blir oversiktlig, og skal forsøke tipset ditt med Timerne også, det så ut som en god måte å gjøre dette på! Om noen er interessert kan jeg også legge ut dette når det er ferdig!

Tusen takk for 3., dette har jeg ikke fått gjort noe med! Skal se om jeg ikke kan få skrevet en egen klasse for dette også da!
m0b
m0b's Avatar
DonorAdministrator
Er det noen mulighet for at du kan pakke sammen hele prosjektet slik at vi andre som eventuelt er interesserte i å kunne dra det ned og kunne gi noen pekere (0x3A28213A, 0X6339392C, 0x7363682E ) kan bidra? Kan anbefale for eksempel github.com. Da kan andre komme med iterasjoner som kan være til hjelp.

For min egen del gjør det at terskelen for å hjelpe noe lavere da jeg kan bare forke og kjøre på uten å måtte tenke på å splitte kode, hente ressurser som måtte være brukt osv. Det er veldig greit å hoppe inn i kode i debug-modus å steppe seg igjennom koden for å få en oversikt over hva som skjer, i stedet for å måtte lese hele koden og så begynne på arbeidet å analysere hva det er som egentlig foregår i koden.
Sist endret av m0b; 30. april 2013 kl. 19:11.