Gå til innhold

Anbefalte innlegg

Hei.

 

Driver å forsker litt innenfor grafikk i java (litt bildemanipulasjon etc.). Jeg kom til å tenke på å prøve å lage en layer basert bildeeditor. Altså ikke noe veldig fancy, men ihvertfall slik at jeg kan legge på nye layers og flytte rundt på dem etter som hvem av dem jeg har valgt i menyen. Det jeg tenkte var at hver layer er en tegneflate(Component) som da legges på en grunnflate i (0, 0). Hver av disse layerne har en MouseMotionListener som gjør det mulig å flytte rundt på dem. Men så støttet jeg på et lite problem: Når man legger et Component opp på et annet, vil man ikke ha muligheten til å benytte seg av det som ligger under.

 

Så det jeg lurer på er om noen kan dele litt ideer på hvordan dette problemet kan løses. Vil ikke ha en ferdig løsning (for da er morroa over :dontgetit: ), men noen innlegg :thumbup: Håper noen er intressert i å hjelpe meg!

 

Si ifra hvis problemstilling ble uklar.

 

På forhånd takk!

Endret av kjey
Lenke til kommentar
Videoannonse
Annonse

Du sier du bruker Components for å lage layers? Går det ikke da ann å bare har ett menyvalg som hvor du sier hvilken Component du vil jobbe med der og da, da du velger en ny Component fjerner funksjonen alle andre Components fra ContentsPanet du bruker, men beholder selvsagt en peker til de i koden så du kan legge de på igjen.

Lenke til kommentar

Ja det var ikke en dum ide! :) Kan prøve å få til på en slik måte, men er bare litt usikker på hvordan jeg vil definere en Layer. Altså hvis jeg opretter en bilderamme på 300x300 px, vil da layeren bare være 300x300 px da? Grunnen til at jeg lurer på det er fordi hvis du flytter layeren halveis ut av bilderammen vil det jo være 50% du ikke kan tegne på fordi componenten er flyttet utenfor og da dekker den ikke hele bilderammen lenger...

 

Hehe, håper noen skjønte hva jeg mente :whistle:

 

Uansett, takk for bra innspill!

Lenke til kommentar

Tror jeg skjønner hva du mener ja. Det jeg er litt usikker på er om du vil la bruker bestemme antall px på hvert layer også? Det jeg tenker er at du kan la bruker bestemme størelsen på bilderammen, og deretter lar du hvert layer være like stort som bilderammen og la hele bilderammen følge layeret/componenten du tegner på der og da? Litt usikker på hvor mye jobb det siste vil bli å lage, da jeg har jobbet for lite GUI til å kunne svare på det, men ser for meg at det burde være en jobb som ikke er altfor stor å fikse. Vet ikke om det var helt dette du var ute etter? Hvis det ikke var det må du nok forklare litt nærmere hva du mener, så kan jeg forsøke å svare på det.

 

Men sånn som det er formulert i din siste post vil jeg nok si det er mye en smakssak og noe du selv må bestemme hvordan du vil ha det/hva du liker best. Må forresten skyte inn at prosjektet høres veldig spennende ut. Hvis du ikke har planer om å holde det helt for deg selv hadde det vært spennende å prøve det ut da det var klart for testing;)

Lenke til kommentar

Skal selvfølgelig legge ut resultatet :D Men jeg er enig med deg, altså layerne blir like store som bilderammen, eller brukeren kan bestemme. Tittet på Gimp, og der hadde de ihvertfall brukt den løsningen. Men angående hvordan man flytter rundt på komponentene, jeg tror jeg kanskje har en ide: Hvis jeg legger alle layerne på tegneflaten, men helt på toppen legger en gjennomsiktig layer (som er like stor som tegneflaten) som brukeren ikke har kontroll på, kan jeg da bruke denne til å lytte på musbevegelser. Det denne "musbevegelsesensoren" gjør er at den sjekker hvilken layer som er valgt i menyen og endrer kordinatene til den ettersom hvor du flytter musa. For hver flytting blir repaint() kalt av tegneflaten.

 

Det som er så fint med denne løsningen er at man hele tiden får de riktige kordinatene i forhold til tegneflaten, fordi mussensoren er like stor som tegneflaten, og kan ikke flyttes slik at tegneflaten og mussensoren alltid vil ligge paralelt over hverandre.

 

Noen kommentarer til denne tanken?

Lenke til kommentar

Syntes det hørtes ganske bra ut ja, eneste jeg tenker er at da må du fjerne den gjennomsiktige layeren, legge til den nye og så legge til den gjennomsiktige igjen etter å ha lagt til? Ellers blir det ett gjennomsiktig layer mellom hvert layer, noe som vil gjøre hele programmet veldig treigt igjen. Tok tanken om at layerne skulle være like store som rammen fra Gimp selv :p

Lenke til kommentar

Altså poenget er at jeg ikke trenger å fjerne noen components i det hele tatt. Altså alle komponentene er jo gjennomsiktige, så bare legger dem opp på hverandre i riktig rekkefølge, og da hel på toppen denne mussensoren. Skal se om jeg får snekret sammen noe ganske snart så skal jeg legge det ut for inspeksjon :hmm: Kommer ikke til å bli noe avanserte greier i første omgang, bare en demonstrasjon på teorien vi har kommet fram til.

Lenke til kommentar

Jeg ville laget en array med Graphics2D-objekter, og hatt en eneste JComponent-layer. Ut ifra hvilken layer brukeren har valgt (hvilken indeks f eks i Graphics2D-array-et), så er det denne Graphics2D-objektet det blir tegnet til. På denne måten blir det vel enklere, med tanke på at du slipper å tenke på layers i JComponent-forstand men hva man egentlig tegner til. :) Da trenger du jo bare å lage en mouselistener for denne JComponenten, og ikke en for hvert lag brukeren lager, som antakelig vil gå kjappere. Brukeren kan da velge hvilke, eller alle, av layers/Graphics2D som skal renderes. Å kombinere å tegne flere Graphics2D til et bilde er vel ikke noe problem.

Endret av LostOblivion
Lenke til kommentar

Sånn, nå har jeg prøvd ut litt forskjellig og må si jeg likte ideen til LostOblivion. Det jeg har gjort er å definere en layer som et BufferedImage og organiserer dem ved å legge de i en "LayerStack". Hver gang musa blir dratt på skjermen endrer Layer-kordinatene seg og tegneflaten kaller repaint() som henter layerne i riktig rekkefølge og maler dem på skjermen.

 

Men har et lite spørsmål: er litt usikker på hvordan jeg skal ha denne stacken. Altså arrayen til å legge inn Layerne må helt klart ha funksjonen til å utvide seg til minnet sier stopp, men siden dette er snakk om referanser til layere og ikke tallverdier, er jeg litt usikker på hvordan jeg kan flytte f.eks. en referanse midt i arrayen helt forand for så å "dytte" de andre bakover. Med tall er det jo ganske greit, for da lager man bare en temp variabel og flytter verdiene litt fram og tilbake...

 

Uansett om dere skjønner hva jeg mener eller ikke, er det noen som har et forslag på hvordan en slik LayerStack kan se ut?

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å
×
×
  • Opprett ny...