Avatar billede kkaen Nybegynder
06. september 2010 - 14:55 Der er 14 kommentarer og
1 løsning

Generere ny label ved tryk på knap

Jeg har lavet en applikation, som bl.a. benytter et layeredPane. På dette pane er der automatisk en label ved start, som kan ændres til et billede. Det kan også flyttes rund i GUI'et.

Jeg har så lavet en knap, som gerne skulle generere en ny knap på samme udgangspunkt i GUI'en, som man så kan gøre det samme ved. Altså så brugeren kan oprette et teoretisk uendeligt antal labels. Problemet er så, at jeg ikke kan få det til at virke. Hvordan opretter man en ny label via knap-tryk på runtime? Jeg har prøvet at give variabel-navnet en new JButton(), men det virker ikke. Jeg har også forsøgt med noget repaint(), for at opdatere gui'en, hvilket heller ikke virker. Skal man lave en tråd til hver label, og løse det sådan? Eller hvordan kan jeg gribe problemet an?
Avatar billede arne_v Ekspert
06. september 2010 - 16:23 #1
Jeg ville nok bruge:

JButton nybtn = new JButton();
lstofbtns.add(nybtn); // for at kunne finde den igen
ditpanel.ad(nybtn);
ditpanel.noget();

hvor noget er enten repaint eller revalidate.
Avatar billede kkaen Nybegynder
06. september 2010 - 21:55 #2
Okay - det ser jo lige så simpelt ud, som jeg forventede, at det kunne gøres :-)

Det vil jeg lige prøve i morgen. For at tage evt. spørgsmål på forkant, så skulle jeg til at spørge om: hvad er "lstofbtns"? Men så så jeg, at det jo nok er en forkortelse for "listOfButtons" - hvormed man kan finde dem igen, som du skriver. Jeg skulle nemlig også til at spørge, om der er mulighed for at hæfte information på hver button, og så iterere igennem dem senere. Men det har du jo sådan set også implicit svaret på :-)

(er mine antagelser korrekte?)
Avatar billede arne_v Ekspert
06. september 2010 - 22:43 #3
Man kan god hente alle children til et panel og teste på deres type etc., men jeg vil mene at det er pænere at gemme en liste.
Avatar billede kkaen Nybegynder
07. september 2010 - 08:54 #4
Nu har jeg forsøgt at implementere det. Men den nye label kommer ikke frem. Umiddelbart vil jeg tro, at labelen har brug for koordinater på grænsefladen, for at kende dets initialiseringspunkt.

Dernæst har jeg oprettet nogle andre knapper, som skal ændre ikonet på den aktuelle label. Disse knapper virker fint nok med den første knap. Men hvad med de resterende, som oprettes under kørsel? Skal man så lave et smart system ang. navngivningen af disse nye labels, og så benytte dette navngivningssystem som argument til modificerings-knapperne?
Avatar billede kkaen Nybegynder
07. september 2010 - 09:14 #5
Jeg er godt nok træt af IDE'er. Nu er den aktuelle initialiserings-label forsvundet. Og jeg har slettet al den kode, jeg har sat ind i dag. Alligevel er den der ikke på runtime. På designtime er den der selvfølgelig. Grrrr...
Avatar billede kkaen Nybegynder
07. september 2010 - 09:20 #6
Godt så - så fik man den frem igen. Ved at indsætte en ny label i IDE'en, så kommer den gamle frem igen på runtime. Næste problem er så, at labellen ikke har det afsnit i sine properties mere, som har med Layout at gøre. Og dette afsnit var netop det afgørende ved denne label, eftersom den skal sættes i drag_layer'et.
Avatar billede kkaen Nybegynder
07. september 2010 - 10:06 #7
Nu har jeg fundet ud af, hvordan de properties sættes fra koden. Det eneste, jeg vist mangler nu, er, at høre lidt overvejelser omkring generering af nye labels og navngivning af dem. Og hvordan man på en smart måde sætter listeners på dem alle sammen. Hvordan der i det hele taget på fornuftig vis holdes styr på et teoretisk virvar af nye labels og kontrol af dem...?
Avatar billede kkaen Nybegynder
07. september 2010 - 14:44 #8
Jeg har forsøgt, at implementere en liste af labels nu, så listens index både repræsenterer hvilken label, der er tale om på et givent tidspunkt, samt hvilken label, der behandles grafisk på GUI'en.

Jeg har bl.a. brugt denne kode:

//create a list of labels:
DefaultListModel model=new DefaultListModel();
JList listOfLabels=new JList(model);

listOfLabels.add(jLabel12);
int number=listOfLabels.getModel().getSize();

Men både før der tilføjes elementer til listen og efter, er sizen=0. Så enten gør jeg noget forkert, eller også er en JList ikke ideel til formålet. Jeg har nu fundet nogle eksempler på nettet, hvor JList netop benyttes til lignende formål - dog hvor listen oprettes ud fra en allerede fuld gruppering af elementer. Men jeg har også fundet eksempler på, at et HashMap skal benyttes. Her ses det:

http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html

at "put" vist kan klare tricket. Jeg har blot tidligere lært, at hash-tables kun skal benyttes, når der er tale om rigtig store mængder data. Jeg går ud fra, at hash-tables og hash-maps er i samme familie. Og eftersom der i mit projekt vel typisk maks skal være 20 elementer, så vil jeg tro, at et hash-map er overkill. Men hvis det virker, så gør det jo sådan set ikke noget :-)
Avatar billede arne_v Ekspert
08. september 2010 - 04:36 #9
Jeg ville bruge en List/ArrayList hvis de skal hentes på index og en Map/HashMap hvis de skal hentes på navn.
Avatar billede kkaen Nybegynder
08. september 2010 - 08:41 #10
Så må jeg nok hellere holde mig til ArrayList, selvom jeg havde håbet på at skulle sætte mig ind i (for mig) nye områder.

Lægger du lige et svar, Arne_v?
Avatar billede arne_v Ekspert
27. september 2010 - 03:59 #11
svar
Avatar billede arne_v Ekspert
27. september 2010 - 04:01 #12
Og den sidste lille finesse:

Vector og Hashtable har samme funktionalitet som ArrayList og HashMap - eneste forskel er at deres metoder er synkroniserede, men de betragtes normalt som værende forældede siden siden ArrayList og HashMap blev introduceret i 1998 !
Avatar billede kkaen Nybegynder
27. september 2010 - 09:07 #13
Vector og HashTables metoder er synkroniserede? Eller ArrayList og HashMaps?

At have synkroniserede metoder er da vel et stort plus? Hvorfor er de så at betragte som forældede?

Jeg er ikke helt med...måske er jeg bare forvirret.
Avatar billede arne_v Ekspert
27. september 2010 - 14:45 #14
Vector og Hashtable har synkroniserede metoder.

Det har ArrayList og HashMap ikke.

Nej - det er ikke en fordel. Erfaringen viser at der som oftest er brug for synkronisering over flere kald og ikke synkronisering af det enkelte kald. Derfor er det bedre at overlade synkronisering til kalder.
Avatar billede kkaen Nybegynder
29. september 2010 - 14:49 #15
Ah, okay :-)
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