30. december 2010 - 14:40Der er
17 kommentarer og 1 løsning
Oprette en ny jLabel af samme navn som den netop indsatte
Hvis man trækker en jLabel rundt i en GUI, og man så gerne vil have en ny instans af den tidligere jLabel (men med samme navn, så man kan referere til den gennem alle sine metoder o.a.), hvordan gør man så det?
Hvis jeg bare skriver: labelNavn=new jLabel("");
så bliver den netop indsatte jLabel renderet som mørk (den forsvinder vel?), og dette var jo ikke meningen.
Hvordan kan man oprette en ny jLabel af samme referencenavn, på samme udgangspunkt i GUI'et som den tidligere jLabel?
"Et midlertidig navn" er jeg ikke helt med på. Jeg kan godt generere et vilkårligt navn til jLabellen, men når programmet så skal modificere jLabellen gennem programmets metoder, så kan den jo ikke finde den mere, når navnet ikke er det samme.
"Sende en reference til metoden" - den er jeg ikke helt med på, hvad du mener med? Altså sende en reference til jLabellen til de metoder i programmet, som så skal modificere jLabellen? Jeg er ikke klar over, hvordan det gøres. Så skal jeg ændre programmets metoder, så jLabellen ændres via referencen i stedet for dens navn. Men det kan vel også gøres :-)
Jeg ser lige, om jeg kan lukke nogle af mine åbne spørgsmål.
Så vil jeg vælge en liste. Har du et eksempel på, hvordan man så genererer nye jLabels, og lægger dem over i denne liste, så de kan refereres til igen?
Hvis jLabels gemmes i en liste, for at der kan oprettes nye jLabels, så skal hele skærmbilledet vel opdateres, når en jLabel flyttes i GUI'et. Kan man gøre dette på en smart måde?
Og hvad med de jLabels, som allerede er indsat i GUI'et - de skal jo stadig have en mouseListener på sig, så de kan modificeres igen. Hvordan sætter man sådan en på de allerede indsatte jLabels, når de ikke længere er "at betragte som jLabels" ?
Det kom jeg ikke meget nærmere en løsning af. Ikke fordi, det var forkert, men det besvarede ikke rigtig min usikkerhed.
Scenariet er den, at jeg allerede har oprettet en Liste, hvori jeg bl.a. har gemt koordinaterne for en indsat jLabel. Disse koordinater kan jeg så udtrække igen, og generere en ny jLabel, som sættes ind på det aktuelle koordinat-punkt. Når hver enkelte nye jLabel genereres, kan jeg hæfte en mouseListener på den, og derved gøre den interaktiv igen.
Vil det være ideelt, hvis skærmbilledet opdateres via .repaint(g), når der gives besked om at en ny jLabel skal genereres? Og lyder mine ideer nogenlunde fornuftige?
Paint() og repaint() gør vist ikke rigtig noget. Og når jeg forsøger, at oprette en ny jLabel, så er det den allerede indsatte jLabel, som ændrer sig. Og det selvom jeg opretter den nye jLabel via:
JLabel jLabel14 = new JLabel("Inserted label"); jLabel14.setBounds(920, 594, 14, 14);
Og her bliver det jo klar angivet, at den nye jLabel skal sættes ind i GUI'et et helt andet sted.
I den her kan du så tilsætte din mouseListener og hvad du nu ellers skal have sat til. Det vigtige er at den bliver tilføjet din liste og samtidigt tilføjet til dit GUI
Rigtig mange tak - det var netop sådan et konkret eksempel på, hvad der kunne gøres, jeg var på udkig efter.
Forskellen mellem dit eksempel og det, jeg selv havde forsøgt at implementere i forvejen, er dog tilsyneladende minimal (men det minimale er jo altafgørende, når man snakker programmering).
I weekenden her arbejdede jeg en del med projektet, og jeg fik ikke løst hovedproblemet. Nu har jeg forsøgt, at flette det interessante fra din kode ind i projektet, men det har desvære ikke gjort nogen afgørende forskel.
Problemstillingen er (før den generelle problemstilling til projektet her kan løses), at jLabel'en ikke renderes rigtigt. I den forgangne uge har jeg undersøgt lidt om de forskellige pain/repain/paintAll-metoder m.m., for at finde ud af, om årsagen til programmets opførsel skulle findes heri. Men det ser ikke sådan ud.
Den aktuelle label skulle gerne renderes, når der blilver valgt en valgmulighed i en combobox. Jeg kan se, at scopet i programmet forløber rigtigt nok, så det er ikke her, hvor der er en fejl eller mangel. Imidlertidig kan jeg se, at hvis jeg laver mouseDown på det område, hvor labellen skulle komme frem, og så flytter musen efterfølgende, så forsøges der faktisk at tegnes en lille label under den flyttende markør. Altså er det et renderingsproblem, der er årsagen p.t..
Jeg har lavet det som: initialiseringsdelen: jLabel label14=new jLabel("");
Comboboxdelen: jLabel14 = new JLabel(""); jLabel14.setBackground(Color.red); jLabel14.setBounds(920, 594, 14, 14); DragDropListener listener = new DragDropListener(); jLabel14.addMouseListener(listener); jLabel14.addMouseMotionListener(listener); jLayeredPane2.add(jLabel14); jLayeredPane2.moveToFront(jLabel14); jLabel14.repaint();
har også førsøgt jlayeredpane2.repaint(); m.m.
Men det renderes altså ikke korrekt. Hvor kan man lave en ændring, så GUI'en renderes korekt?
Jeg fik lige den tanke, at "opaque" måske var sat, og havde indflydelse på problemstillingen. Og ganske rigtigt - det felt var afkrydset. Så jeg fjernede afkrydsningen, og nu kommer teksten da frem på labellen. Så langt - så godt. Men labellens farve bliver stadig ikke renderet. Mystiskt...
Nu renderes labellen også, når den trækkes rundt i GUI'et. Men nu trækker den et "spor" efter sig i GUI'en, når den trækkes rundt. Det har jeg tidligere læst skyldes, at de resterende componenter ikke opdateres. Så dette har jeg forsøgt at gøre gennem et simpelt mainPanel.paintAll(mainPanel.getGraphics()). Det virker også fint på sin vis - bortset fra, at nu "blinker" hele skærmen, når labellen trækkes rundt. Jeg har tidligere læst mig til, at dette skyldes, at skærmbilledet bliver "null-sat" ved kald af en af paint-metoderne. Men mere har jeg ikke kunnet finde ud af. Ej heller en løsning...?
Nu har jeg ordnet problemet med "sporet" efter jlabellen. Jeg har simpelthen brugt .update(g) på alle de resterende elementer i GUI'et, og kaldt dem inde i mouseDragget. Det virker stort set tilfredsstillende på alle elementer, men det giver indtryk af en "hovsa-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.