/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
AWT kode struktur problem
Fra : Jan Uhre


Dato : 09-08-03 22:00

Hej

Jeg har et problem, der måske bunder i, at min måde at programmere på, ikke
er kompatibel med Java's grafik-struktur... men det håber jeg nu ikke.

Jeg har ledt efter eksempler, der kunne hjælpe mig mange steder, men da de
fleste sample programmer, der findes illusterer eksemplet med en enkelt
klasse, hjælper de mig desværre ikke.

Det er ikke et specifikt problem, men ret generelt, så jeg har ingen program
eksempler, men jeg vil prøve at beskrive mit problem:


Lad os sige, jeg ville programmere et skakspil, der kører i en Applet.

Hovedklassen er en Applet. Der er ikke noget, der tegnes i denne klasse, da
disse detaljer skal i underliggende objekter.

Applet objektet har en Board-klasse, som tegner brættet, ved at bede alle
felter tegne sig selv.

Board'ets felter er et array af Field, som kan tegne sig selv, og bede evt.
brikker om at tegne sig selv.

Endelig er der Piece, som Field altså kan have en reference til (hvis der
står en brik på feltet).

Alle klasserne har paint() og overwrite'de update() funktion, med det formål
at de kan tegne sig selv.


Hele dette billede lader sig jo nemt tegne, ved at Applet-objektets paint()
kalder Board's paint(), som kalder hvert Field's paint(), som evt kalder
paint() for et Piece. Dermed fungerer update's fint, når vinduet f.eks har
været minimeret el. lign.


Problemet opstår så, når update skal initieres fra nogle af de underliggende
objekter... f.eks.:
Brugeren klikker på et felt. Applet'ens MouseListener kalder en funktion i
Board-objektet med musens koordinater. Board-objektet regner det tilhørende
felt ud, beder Field-objektet om at returnere det Piece, der står på feltet
(hvis noget). Denne brik flyttes så.

Det er nu Board objektet - og ikke Applet-objektet, der ved, at der er sket
ændringer og hvilke. Hvordan skal jeg så bære mig ad med at opdatere
billedet (og endnu bedre kun det clip af billedet, der har ændret sig)???

Jeg kan ikke kalde repaint(), for det er ikke Applet-repaint(), men
Board-repaint() og så sker der intet med billedet.

Jeg kan selvfølgelig give Board objektet en reference til Applet objektet
(så der er en dobbelt reference), men det virker lidt ekstremt.


Jeg håber, jeg har forklaret mit problem godt nok. Jeg er som nævnt ikke
klar over, om jeg strukturer programmet helt forkert, eller hvad, men jeg
håber, at jeg kan få nogle gode kommentarer her fra gruppen.

På forhånd tak

Mvh Jan Uhre



 
 
Ulrik Magnusson (09-08-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 09-08-03 23:28



Jan Uhre wrote:

> Jeg kan ikke kalde repaint(), for det er ikke Applet-repaint(), men
> Board-repaint() og så sker der intet med billedet.
>
> Jeg kan selvfølgelig give Board objektet en reference til Applet objektet
> (så der er en dobbelt reference), men det virker lidt ekstremt.

Et eller andet sted _skal_ du jo bede Applet objektet om at gentegne sig
selv, men du kan jo skjule referencen til Applet objektet bag en anden
type - en slags listener som kan/skal reagere på ændringer i den
grafiske præsentation (og som evt. tager et Rectangle objekt som siger
hvor ændringen er sket).

interface ClipGraphicsChangeListener
{
public void clipGraphicsChanged( java.awt.Rectangle clip );
}

class ChessApplet
extends java.awt.Applet
implements
ClipGraphicsChangeListener
{
public void clipGraphicsChanged( java.awt.Rectangle clip )
{
// repaint eller lav evt. union med tidligere clip,
// hvis der ikke umiddelbart skal gentegnes.
this.clip = clip;
repaint();
}

public void paint( java.awt.Graphics g )
{
g.clipRect( clip );
board.draw( g );
}

}

Ulrik Magnusson


Jan Uhre (10-08-2003)
Kommentar
Fra : Jan Uhre


Dato : 10-08-03 03:38


"Ulrik Magnusson" <ulrikm@yahoo.com> wrote in message
news:3F35755A.3D5BA76B@yahoo.com...
>
>
> Jan Uhre wrote:
>
> > Jeg kan ikke kalde repaint(), for det er ikke Applet-repaint(), men
> > Board-repaint() og så sker der intet med billedet.
> >
> > Jeg kan selvfølgelig give Board objektet en reference til Applet
objektet
> > (så der er en dobbelt reference), men det virker lidt ekstremt.
>
> Et eller andet sted _skal_ du jo bede Applet objektet om at gentegne sig
> selv, men du kan jo skjule referencen til Applet objektet bag en anden
> type - en slags listener som kan/skal reagere på ændringer i den
> grafiske præsentation (og som evt. tager et Rectangle objekt som siger
> hvor ændringen er sket).
>
> interface ClipGraphicsChangeListener
> {
> public void clipGraphicsChanged( java.awt.Rectangle clip );
> }
>
> class ChessApplet
> extends java.awt.Applet
> implements
> ClipGraphicsChangeListener
> {
> public void clipGraphicsChanged( java.awt.Rectangle clip )
> {
> // repaint eller lav evt. union med tidligere clip,
> // hvis der ikke umiddelbart skal gentegnes.
> this.clip = clip;
> repaint();
> }
>
> public void paint( java.awt.Graphics g )
> {
> g.clipRect( clip );
> board.draw( g );
> }
>
> }
>
> Ulrik Magnusson
>

Tak for dit svar, Ulrik.

Det er nu ikke fordi, jeg behøver at gemme referencen til Applet objektet -
mere fordi jeg generelt har et problem med at have referencer, der bevæger
sig opad i objekt-hierarkiet. Det er ikke just OOP-principper efter bogen.
Men selvfølgelig... ingen regel uden undtagelser

Men det du siger er altså, at hvis man vil opdele view-delen af programmet i
logiske objekter, så er det kun muligt, hvis alle objekter, der skal kunne
opdatere display'et har en reference til Applet?

Hvis det er den eneste mulighed, må jeg jo bare lære at leve med det. Jeg
vil bare gerne have bekræftet, at det ikke er en helt 'forkert' måde, jeg
strukturer mine programmer på.

Hvis du eller andre har kommentarer, hører jeg dem gerne.

Mvh Jan Uhre



Ulrik Magnusson (10-08-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 10-08-03 10:01



Jan Uhre wrote:

> Men det du siger er altså, at hvis man vil opdele view-delen af programmet i
> logiske objekter, så er det kun muligt, hvis alle objekter, der skal kunne
> opdatere display'et har en reference til Applet?

Ikke nødvendigvis, det er vel kun Board objektet som behøver at give besked,
og som i forvejen ved hvornår enkelte dele ændrer sig.

> Hvis det er den eneste mulighed, må jeg jo bare lære at leve med det. Jeg
> vil bare gerne have bekræftet, at det ikke er en helt 'forkert' måde, jeg
> strukturer mine programmer på.

Om det er specielt pænt, ved jeg ikke, men jeg har umiddelbart ikke lige andre
bud.

Ulrik Magnusson


Jan Uhre (10-08-2003)
Kommentar
Fra : Jan Uhre


Dato : 10-08-03 18:47


"Ulrik Magnusson" <ulrikm@yahoo.com> wrote in message
news:3F3609B7.DE4F82E7@yahoo.com...
>
>
> Jan Uhre wrote:
>
> > Men det du siger er altså, at hvis man vil opdele view-delen af
programmet i
> > logiske objekter, så er det kun muligt, hvis alle objekter, der skal
kunne
> > opdatere display'et har en reference til Applet?
>
> Ikke nødvendigvis, det er vel kun Board objektet som behøver at give
besked,
> og som i forvejen ved hvornår enkelte dele ændrer sig.

Ja, korrekt. I dette eksempel i hvert fald - og for det meste vil det vel
være sådan.

> > Hvis det er den eneste mulighed, må jeg jo bare lære at leve med det.
Jeg
> > vil bare gerne have bekræftet, at det ikke er en helt 'forkert' måde,
jeg
> > strukturer mine programmer på.
>
> Om det er specielt pænt, ved jeg ikke, men jeg har umiddelbart ikke lige
andre
> bud.
>
> Ulrik Magnusson

Næ... det er vel lige så meget en smagssag. Men du har i hvert fald hjulpet
mig.

Tak for hjælpen endnu en gang.

Mvh Jan Uhre



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste