Avatar billede nielsenmathias Nybegynder
30. november 2007 - 11:31 Der er 3 kommentarer og
1 løsning

Java GlassPane samt paint,repaint,update

Hejsa.

Jeg arbejder på en tegneapplikation der skal kunne tegne figurer på et jpanel. de skal også kunne flyttes hvis man trækker i dem, og man skal helst kunne se dem følge musen når man trækker.

Mit problem er at programmet bliver meget sløvt hvis jeg har indsat mange figurer. Det skyldes at jeg kalder repaint på mit jpanel hver gang der sker noget, fx at man trækker i én figur. repaint sørger så for at tegne alle figurer, altså også dem der ikke bliver berørt!

Istedet vil jeg gerne gentegne figuren der bliver trukken, og lade alle andre figurer være som de er.

Men det er absolut nemmere sagt end gjort. Hvis jeg blot gentegner den pågældende figur forsvinder de andre nemlig! Hvis jeg kun gentegner det område hvor figuren er (vha. repaint(rect)), så trækker figuren et slør og overtegner iøvrigt andre figurer hvis den trækkes henover.

Nogen der har nogen ideer til hvordan det kan gøres?
Jeg har været inde over at anvende et Jcomponent og sætte den som glasspane i min frame. Den skulle så indeholdende de figurer der bliver trukket. Min ide var at man så kunne kalder repaint på glasspane, og da den er gennemsigtigt ville man få tegnet de figurer man trækker, mens det nedenunder ville være status quo. Det kan jeg dog ikke få til at virke, da repaint på mit glasspane (en Jcomponent) automatisk sletter baggrunden!! det skyldes vist at JComponent er lightweight og derfor ikke anvender update, men istedet går direkte til paint - og i update slettes baggrunden ikke automatisk, det gør den i paint!

Håber meget nogen kan hjælpe

Mvh Mathias
Avatar billede _carsten Nybegynder
30. november 2007 - 21:32 #1
Jeg har nu tæsket rundt i en time for at finde et eksempel jeg lavede engang, men det er desværre ikke lykkedes mig endnu og det er noget siden jeg sidst har rodet tegnefunktioner, så jeg kan ikke lige vriste den ud af hukommelsen.

Men når vi snakker Swing komponenter skal du override paintComponent IKKE paint, du får ingen compilefejl eller runtimefejl, men det rigtige er at override paintComponent

Alternativet til mit eget eksempel må være følgende link: http://www-mips.unice.fr/Doc/Java/Tutorial/2d/display/user.html

Tag et kig på SwingShapeMover.java, den skal du så vidt jeg husker kombinere med setClip() og getClip() sådan at du kun gentegner det område som bliver 'beskadiget'

Nærmere kan jeg desværre ikke komme det lige pt. :(
Avatar billede nielsenmathias Nybegynder
03. december 2007 - 10:18 #2
Hej Carsten og tusind tak for dit input.

I eksemplet kan jeg se at han bruger repaint for at tegne det han har defineret i last variablen.

Jeg har af mange gode grunde delt det jeg skal tegne op i objekter, der hver indeholder en paint metode. Det gør mit JPanel (drawingarea) også., og jeg tegner ved at kalde reapint på det jpanel, og så manuelt kalde objekternes paint med grafik objektet. det svarer vel nogenlunde til hvis jeg det eksempel du henviser til også havde last variablen i et objekt for sig.

Mit spørgsmål gik mere på repaint kaldet, da et kald til repaint uden argumenter (og det er også tilfældet i dit eksempel) gen-tegner hele(!) tegnefladen - altså gentegner alle indsatte objekter. og det gør min applikation noget tung.

Jeg arbejder i øjeblikket på en løsning, hvor jeg specificerer et argument når jeg kalder repaint, bestående af det rektangel som dækker det objekt jeg trækker - grafik objekter i JPanel.paint har derefter ordre til kun at gentegne netop det område og ignorere alt andet. Herefter undersøger jeg manuelt om de andre indsatte objekter har risiko for at være overtegnet (hvis træk-objektets rektangel overskrider det pågældendes). hvis ja, gen-tegner jeg det overtegnede objekt, hvis ikke ignorerer jeg det.
Dette resulterer i at jeg som oftest kun skal gentegne et par objekter af gangen, og jeg har fået væsentlig bedre performance.

Jeg tror også det er nogenlunde sådan at javas gui virker under-the-hood. om man kunne ha udnyttes det i mit tilfælde ved jeg ikke helt, og det er heller ikke sådan de gør det i det eksempel du henviser til.

Nå, men igen mange tak for input. håber du har en kommentar til min løsning, eller alternativt et andet forslag.

Mathias
Avatar billede nielsenmathias Nybegynder
11. december 2007 - 18:11 #3
det virker nu. tak for input
Avatar billede _carsten Nybegynder
11. december 2007 - 18:34 #4
Velbekomme
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester