Avatar billede kkaen Nybegynder
30. december 2010 - 14:40 Der 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?
Avatar billede heinzdmx Nybegynder
30. december 2010 - 15:11 #1
Du kan måske lave en midlertidig navn?
Men hvad med i stedet at sende en reference til metoden?
Avatar billede heinzdmx Nybegynder
30. december 2010 - 15:14 #2
Desuden får du nok mere hjælp hvis du samler op på dine åbne spørgsmål
eksperten.dk/list/aabnespoergsmaal/kkaen
Avatar billede kkaen Nybegynder
30. december 2010 - 15:48 #3
"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.
Avatar billede heinzdmx Nybegynder
30. december 2010 - 16:24 #4
Reference..

void changeLabel(JLabel dinlabel)
{
  // denne metode gør noget med labelen...
}
Avatar billede kkaen Nybegynder
30. december 2010 - 16:31 #5
Men så ender jeg jo op med et vilkårligt antal jLabels. Så selvom referencen blot benyttes, så bliver det vel alligevel et hav af jLAbels?
Avatar billede heinzdmx Nybegynder
30. december 2010 - 16:41 #6
ja.. du kan jo heller ikke have flere labels på samme reference.

Så kan du vælge om du skal lave det som et array eller en liste.

For hver label der skal vises skal du have en reference
Avatar billede kkaen Nybegynder
30. december 2010 - 16:52 #7
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?
Avatar billede kkaen Nybegynder
30. december 2010 - 17:15 #8
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" ?
Avatar billede heinzdmx Nybegynder
30. december 2010 - 17:51 #9
Du skal lave en liste af objecter med typen jLabel.

List<JLabel> labels = new ArrayList<JLabel>();


Opretter en liste hvor kun JLabels er at finde i.

Så kan du bruge
labels.add(new JLabel(""));


til at tilføje og så kan du trække dem ud vha. af nogle metoder

Se
http://download.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html
Avatar billede kkaen Nybegynder
30. december 2010 - 18:32 #10
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?
Avatar billede kkaen Nybegynder
30. december 2010 - 20:51 #11
Nu har jeg prøvet mig lidt frem. Men jeg kan ikke få det til at virke. Den brugte kode er denne:

JLabel newLabel=new JLabel();
newLabel.setBackground(Color.red);
newLabel.setBounds(Integer.parseInt(firstPart),
  Integer.parseInt(lastPart), 14, 14);

jLayeredPane2.add(newLabel, javax.swing.JLayeredPane.DRAG_LAYER);
jLayeredPane2.paint(jLayeredPane2.getGraphics());

newLabel.repaint();

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.

Er det mine paint() og repaint(), den er gal med?
Avatar billede heinzdmx Nybegynder
02. januar 2011 - 15:08 #12
Prøv:

[div]List<JLabel> labels = new ArrayList<JLabel>();

private void DoSomething()
{
JLabel newLabel=new JLabel("Something to show");
newLabel.setBackground(Color.red);
newLabel.setBounds(Integer.parseInt(firstPart),
  Integer.parseInt(lastPart), 14, 14);

jLayeredPane2.add(newLabel, javax.swing.JLayeredPane.DRAG_LAYER);
jLayeredPane2.paint(jLayeredPane2.getGraphics());

newLabel.repaint();
labels.add(newLabel);
}

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
Avatar billede kkaen Nybegynder
03. januar 2011 - 09:19 #13
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?
Avatar billede kkaen Nybegynder
03. januar 2011 - 09:30 #14
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...
Avatar billede kkaen Nybegynder
03. januar 2011 - 10:33 #15
Gennembrud:
Ah, ifølge
http://stackoverflow.com/questions/2380314/how-do-i-set-a-jlabels-background-color
så er opaque netop vigtig ved jLabels - og den skal manuelt sættes til "true". Så det har jeg gjort nu. Og vupti - nu bliver labellen renderet korrekt :-)

Næste prblem er så, at labellen også renderes, når den trækkes rundt i GUI'et med mouseListeneren.
Avatar billede kkaen Nybegynder
03. januar 2011 - 15:04 #16
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...?
Avatar billede kkaen Nybegynder
04. januar 2011 - 12:00 #17
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"...
Avatar billede kkaen Nybegynder
14. juni 2011 - 12:58 #18
lukkes.
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