Gå til innhold

trenger et simpelt eksempel på hvordan Observer og Observable fungerer


Anbefalte innlegg

Hei. Vi har et prosjekt som innebærer å programmmere et program for et eiendomsmegler-firma. Vi har skrevet datastrukturen. Den består av klassene;

 

  • Bolig (abstraktklasse med subklassene EneboligOgRekkehus og Leilighet)
  • Person
  • Bud
  • Dato
  • Budliste (datalagring med pekere)
  • Boligliste (datalagring med pekere)

Boliglisten er "arkivet" i programmet. Den innholder boliger som peker til neste. Hver bolig ineholder data om boligen, objekter fra de andre klassene og en budliste.

Dato-lagring

Vi har forsøkt å bruke klassen Date fra javas klassebibliotek, men den gjør en del feil. Finnes en klasse som har samme funksjonalitet som Date, men fungerer? Hva gjør dere for lagring av et tidspunkt på en dato?

 

Dato-velger

Vi leter etter en dato-velger til brukergrensesnittet. Vi har søkt litt rundt og funnet en del under navnet JCalendar, men som ikke er i javas klassebibliotek. Vi er litt usikre på hvordan en bruker klasser som er utenfor javas klassebibliotek. Hva bruker dere for å få datoer som input? I noen av vinduene til programmet kunne vi trengt timer og minutter i tillegg.

 

Brukergrensesnitt med flere vinduer

La oss si du har et register med objekter i programmet ditt (i dette tilfellet med boliger), og når programmet åpnes starter man hovedvinduet. Dette vinduet har da et objekt av registeret, og lukker man vinduet lukker man programmet. Utifra dette vinduet skal nye vinduer åpnes, der en gjør diverse ting meg registeret (forandrer på objekter, tilføyer nye objekter osv.). Er det vanlig å da sende registeret til disse vinduene som parameter, og forandrer dette registerobjektet som hovedvinduet inneholder?

 

Bruk av JTable

Planen vår for hovedvinduet, var å ha en JTable der alle boligene i listen dukket og, en kunne markere en linje (et objekt), og trykke på en knapp for å få opp et vindu for denne handlingen. Etter vi har lest litt mer om JTable, virker det som om dette kan bli svært vanskelig med en liste-datalagring vi har laget selv. Vi ser i de forskjellige konstruktør-parameterene til JTable at det er en som tar imot objekter av typen Vector. Jeg skulle gjerne hørt fra noen som har erfaring med JTable og Collections.

 

  • Hva slags datalagring er best for samspill med JTable?
  • Hvordan kan en fylle en tabell med info fra objekter i et Vector-"arkiv"?

Endret av abbarve
Lenke til kommentar
Videoannonse
Annonse

Hei. Vi har et prosjekt som innebærer å programmmere et program for et eiendomsmegler-firma. Vi har skrevet datastrukturen. Den består av klassene;

 

  • Bolig (abstraktklasse med subklassene EneboligOgRekkehus og Leilighet)
  • Person
  • Bud
  • Dato
  • Budliste (datalagring med pekere)
  • Boligliste (datalagring med pekere)

Boliglisten er "arkivet" i programmet. Den innholder boliger som peker til neste. Hver bolig ineholder data om boligen, objekter fra de andre klassene og en budliste.

Dato-lagring

Vi har forsøkt å bruke klassen Date fra javas klassebibliotek, men den gjør en del feil. Finnes en klasse som har samme funksjonalitet som Date, men fungerer? Hva gjør dere for lagring av et tidspunkt på en dato?

 

Dato-velger

Vi leter etter en dato-velger til brukergrensesnittet. Vi har søkt litt rundt og funnet en del under navnet JCalendar, men som ikke er i javas klassebibliotek. Vi er litt usikre på hvordan en bruker klasser som er utenfor javas klassebibliotek. Hva bruker dere for å få datoer som input? I noen av vinduene til programmet kunne vi trengt timer og minutter i tillegg.

 

Brukergrensesnitt med flere vinduer

La oss si du har et register med objekter i programmet ditt (i dette tilfellet med boliger), og når programmet åpnes starter man hovedvinduet. Dette vinduet har da et objekt av registeret, og lukker man vinduet lukker man programmet. Utifra dette vinduet skal nye vinduer åpnes, der en gjør diverse ting meg registeret (forandrer på objekter, tilføyer nye objekter osv.). Er det vanlig å da sende registeret til disse vinduene som parameter, og forandrer dette registerobjektet som hovedvinduet inneholder?

 

Bruk av JTable

Planen vår for hovedvinduet, var å ha en JTable der alle boligene i listen dukket og, en kunne markere en linje (et objekt), og trykke på en knapp for å få opp et vindu for denne handlingen. Etter vi har lest litt mer om JTable, virker det som om dette kan bli svært vanskelig med en liste-datalagring vi har laget selv. Vi ser i de forskjellige konstruktør-parameterene til JTable at det er en som tar imot objekter av typen Vector. Jeg skulle gjerne hørt fra noen som har erfaring med JTable og Collections.

 

  • Hva slags datalagring er best for samspill med JTable?
  • Hvordan kan en fylle en tabell med info fra objekter i et Vector-"arkiv"?

 

Lag deres egen DataModel til JTable. Denne datamodellen kan lagre data akkurat slik dere ønsker og JTable kan vise den.

Lenke til kommentar

Angående datalagring; vi skulle helst sette inn objekter i fronten. Vi vurderer å bruke enten ArrayList eller Vector, helst ArrayList. Hvis vi bruker metoden add(int index, Object element) og bruker indexen 1, setter den inn forrest og dytter de andre objektene videre?

Lenke til kommentar

lol, jeg fant ut av det i stad selv. glemte meg litt. funket veldig bra.

 

En ting jeg lurte litt på; når jeg initialiserer ArrayList-objektet med konstruktøren new ArrayList(int initialCapacity), og bruker 0 som parameter. Deretter fyller inn objekter til indeks 0 alltid, utvider den arrayen hver eneste gang? Slik at jeg aldri har tomme plasseringer? Kan dette bli problematisk? Når jeg sletter objekter, sørger klassen for at det ikke blir noen tom-rom?

Endret av abbarve
Lenke til kommentar

En ting jeg virkelig kunne trengt å vite. La oss si du har et hovedvindu. Denne klassen inneholder blant annet et objekt av typen Register, og en metode som starter et nytt vindu (med det nye vindu-klasses konstruktør). Det nye vinduet tar imot Register-objektet i parameteret i konstruktøren. I klassen til det nye vinduet gjør du forandringer på Register-objektet klassen har. Vil disse forandringene være på Register-objektet i hovedvinduet, eller på en kopi av Register-objektet i et nytt vindu?

Lenke til kommentar

lol, jeg fant ut av det i stad selv. glemte meg litt. funket veldig bra.

 

En ting jeg lurte litt på; når jeg initialiserer ArrayList-objektet med konstruktøren new ArrayList(int initialCapacity), og bruker 0 som parameter. Deretter fyller inn objekter til indeks 0 alltid, utvider den arrayen hver eneste gang? Slik at jeg aldri har tomme plasseringer? Kan dette bli problematisk? Når jeg sletter objekter, sørger klassen for at det ikke blir noen tom-rom?

En ArrayList består i grunn av et array-objekt og en teller. Når du føyer objekter til ArrayList, blir objektene (referensene) lagret i de gitte indeks-posisjoner i array-objektet, og telleren blir inkrementert. Så snart array-objektet blir fullt, blir et nytt array-objekt laget, med større kapasitet, og objektene i det gamle array-et blir kopiert inn i det nye og større arrayet. Når et objekt slettes, blir telleren dekrementert og objekt-referansen blir satt til "null".

 

InitialCapacity sier hvor stort arrayet i ArrayList skal være ved initialisering. Standard er 10, noe du ikke trenger å forandre på hvis du ikke vet hva dette impliserer. I noen applikasjoner ville det være nødvendig å forandre denne hvis en får problemer med ytelse, men da er det snakk om applikasjoner med mange arraylists og/eller arraylists med mange objekter. I ditt tilfelle skal det ikke ha noe å si.

Lenke til kommentar

En ting jeg virkelig kunne trengt å vite. La oss si du har et hovedvindu. Denne klassen inneholder blant annet et objekt av typen Register, og en metode som starter et nytt vindu (med det nye vindu-klasses konstruktør). Det nye vinduet tar imot Register-objektet i parameteret i konstruktøren. I klassen til det nye vinduet gjør du forandringer på Register-objektet klassen har. Vil disse forandringene være på Register-objektet i hovedvinduet, eller på en kopi av Register-objektet i et nytt vindu?

Man sender ikke objekter, men referanser (eller kopier av referanser for å være nøyaktig). Man lager aldri kopier av objektet selv når man bruker et objekt som argument i konstruktører/metoder. En kopi av en referanse "behandler" det samme objektet som original-referansen.

Lenke til kommentar

En ArrayList består i grunn av et array-objekt og en teller. Når du føyer objekter til ArrayList, blir objektene (referensene) lagret i de gitte indeks-posisjoner i array-objektet, og telleren blir inkrementert. Så snart array-objektet blir fullt, blir et nytt array-objekt laget, med større kapasitet, og objektene i det gamle array-et blir kopiert inn i det nye og større arrayet. Når et objekt slettes, blir telleren dekrementert og objekt-referansen blir satt til "null".

La oss si jeg initialiserer ArrayList'en med InitialCapacity 0, og setter inn 10 objekter etter hverandre på indeks 0. Hvis jeg da bruker metoden remove(int index) på index 5, vil da index 5 være "null", eller vil ArrayList'en flytte på objekter slik at høyeste index i ArrayList'en er 8 (det 9ende objektet)? Med andre ord, hvis jeg bruker en "for"-løkke for å gå igjennom ArrayList'en, må jeg sjekke om hvert objekt er "null" for å unngå NullPointerException?

 

..."behandler" det samme objektet som original-referansen.

Flott! Da vil bruk av flere vinduer bli langt mindre komplisert, og med mindre kode.

 

EDIT: Takk btw :thumbup:

Endret av abbarve
Lenke til kommentar

La oss si jeg initialiserer ArrayList'en med InitialCapacity 0, og setter inn 10 objekter etter hverandre på indeks 0. Hvis jeg da bruker metoden remove(int index) på index 5, vil ArrayList'en flytte på objekter slik at høyeste index i ArrayList'en er 8 (det 9ende objektet).

Dette. Dessuten bør du aldri bruke InitialCapacity 0. Det gir dårligere ytelse.

Lenke til kommentar

Hvis du skal importere flere klasser før en klasse; har det noe å si om du bruker javax.swing.JButton eller javax.swing.*? I vinduene bruker jeg flere swing elementer, men bruker for eksempel bare 1 klasse fra java.util. Hva er mest profesjonelt og tar minst ytelse?

 

La oss si at jeg lager "Vector<String> kolonneNavn" og "Vector<Vector<String>> radData" og sender de med i konstruktøren til JTable. Hvis jeg gjør forandringer på radData, vil det vises i JTable'en? Hvis ikke, hva er den beste måten å få ny input til JTable'en?

Endret av abbarve
Lenke til kommentar

Hvis du skal importere flere klasser før en klasse; har det noe å si om du bruker javax.swing.JButton eller javax.swing.*? I vinduene bruker jeg flere swing elementer, men bruker for eksempel bare 1 klasse fra java.util. Hva er mest profesjonelt og tar minst ytelse?

Ytelse har ikke noe å si. Hvis du bruker en IDE, så tar den som regel seg av all imports, og importerer dem som javax.swing.JButton. Jeg synes det er bedre å bruke javax.swing.JButton istedenfor javax.swing.*. I noen tilfeller er du faktisk nødt til å bruke en import-linje per klasse. F.eks. hvis du bruker java.util.* og java.sql.*, så kan du ikke skrive følgende:

...
Date myDate = new Date(); // Compile Error. java.util.Date eller java.sql.Date?
...

 

La oss si at jeg lager "Vector<String> kolonneNavn" og "Vector<Vector<String>> radData" og sender de med i konstruktøren til JTable. Hvis jeg gjør forandringer på radData, vil det vises i JTable'en? Hvis ikke, hva er den beste måten å få ny input til JTable'en?

Bruk TableModel.

Lenke til kommentar

 

Jeg har laget en TableModel nå. Den tar imot (Vector<String> kolonneNavn, Vector<Vector<String>> radData) i konstruktøren. Når jeg skal søke på ting eller nullstille tabellen, har jeg tenkt til å ha metoder som forandrer på radData objektet. Skal jeg sende den til TableModel, slik at den får oppdatert objektet? Så må jeg vel oppdatere JTable objektet. Hvordan foreslår du at jeg gjør det?

 

Takk for hjelpen :thumbup:

Lenke til kommentar

 

Jeg har laget en TableModel nå. Den tar imot (Vector<String> kolonneNavn, Vector<Vector<String>> radData) i konstruktøren. Når jeg skal søke på ting eller nullstille tabellen, har jeg tenkt til å ha metoder som forandrer på radData objektet. Skal jeg sende den til TableModel, slik at den får oppdatert objektet? Så må jeg vel oppdatere JTable objektet. Hvordan foreslår du at jeg gjør det?

 

Takk for hjelpen :thumbup:

Jeg regner med at det er GUI'en som modifiserer dataen. Da kan du lage noen add/remove metoder i TableModel'en for å editere radData, og som samtidig varsler JTable om endringer. Sjekk ut Firing Data Change Events i TableModel-linken.

Lenke til kommentar

Nå er jeg 90% ferdig med alt. Det eneste som mangler er 3 små funksjoner og et vindu jeg er 90% ferdig med. Men jeg har kommet frem til at jeg trenger en Observer for å unngå en spesifikk feil. Vektor-objektet til JTable inneholder index'ene til boligene (er ikke synlig på tabellen). Problemet er hvis du lager en ny bolig, så oppdaterer ikke tabellen seg. Jeg kunne trengt en observer som overvåker register-objektet, og hvis det skjer en forandring så utføres 1 eller 2 metoder. Jeg har lest litt om Observer og Observable, men sliter med å forstå.

 

Jeg håper på en forklaring på hva det mest elementære du trenger er, for å kunne utføre 1 eller 2 metoder når en forandring skjer på objektet. Jeg ønsker å ha en liten private klasse i slutten på klassen Hovedvindu (som inneholder register-objektet).

 

Takk for all hjelpen så langt

 

 

-nvm fant ut av det

Endret av abbarve
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...