Avatar billede kkaen Nybegynder
20. december 2010 - 11:45 Der er 20 kommentarer og
1 løsning

Sætte icon i en jLabel

Jeg vil gerne oprette et antal jLabels i min applikation. Typen jLabel er nødvendig, da jeg har fundet ud af, hvordan man kan trække jLabels rundt i GUI'et.

Problemet opstår, når jeg gerne vil styre jLabellens udseende fra koden. En jLabel skal helst fremstå som en cirkel, men en jLabel er vel som udgangspunkt en rektangel.

Jeg har derfor forsøgt, at opnå det ønskede på bl.a. denne måde:

Shape circle = new Ellipse2D.Float(100.0f, 100.0f, 100.0f, 100.0f);
Image image=(Image)circle;
Icon imageIcon=(Icon)image;
jLabel14.setIcon(imageIcon);

Men jeg kan ikke få det til at virke.

Findes der virkelig ikke en metode til at lave en jLabel til en cirkel?
Avatar billede arne_v Ekspert
20. december 2010 - 14:55 #1
En mulighed er at lave en klasse som arver fra JLabel og overrider den metode der staar for selve tegningen af den.
Avatar billede kkaen Nybegynder
20. december 2010 - 16:12 #2
Ja, det var selvfølgelig en mulighed. Jeg gik bare ud fra, at det ville være ret omfattende. Men ved nærmere eftertanke burde det vel egentlig ikke være så omfattende endda.

I mellemtiden har jeg forsøgt blot at give jLabel en baggruundsfarve, og skrive et enkelt tegn i dens tekst. Så var det meningen, at man skulle kunne drag&drop labellen på gui'en. Men det virker ikke rigtigt. Hvis jeg forsøger at trække labellen langsomt, så kan jeg se, at en del af dens rektangel bliver overskrevet af en hvis rektangel. Og den hvide rektangel bevæger sig langsomt, når jeg efterfølgende bevæger cursoren. Jeg går derfor ud fra, at for at implementere en effektiv drag&drop på en jLabel, så skal jLabellen have sat et ikon på sig? Altså så baggrundsfarve og tekst ikke er nok?
Avatar billede arne_v Ekspert
20. december 2010 - 16:19 #3
Det er ret simpelt.

Her er et eksempel som extender JPanel i.s.f. JLabel:

class MyCircle extends JPanel {
  private Color c;
  public MyCircle(Color c) {
      this.c = c;
      this.setPreferredSize(new Dimension(100, 100));
  }
  public void paintComponent(Graphics g) {
      g.setColor(c);
      g.fillOval(0, 0, 100, 100);
  }
}
Avatar billede arne_v Ekspert
20. december 2010 - 16:19 #4
drag and drop kraver lidt kode i Swing
Avatar billede kkaen Nybegynder
20. december 2010 - 17:13 #5
Jeg kan ikke lige oversætte "i.s.f."...?

Da det blot er meningen, at der skal kunne trækkes et lille billede rundt i applikationen, virker det vel ikke med jPanel. Derimod har jeg tidligere fået det til at virke med jLabel (selvom jeg ikke har koden længere).

Hvis man udskifter "JPanel" i dit eksempel med "jLabel", vil man så opnå det ønskede?
Avatar billede arne_v Ekspert
20. december 2010 - 17:25 #6
i.s.f. - i stedet for
Avatar billede arne_v Ekspert
20. december 2010 - 17:26 #7
ja - JPanel har bare lidt mindre bagage end JPanel

eksmepel med JLabel:

http://www.java2s.com/Code/Java/Swing-JFC/Scrollpaneruler.htm
Avatar billede kkaen Nybegynder
20. december 2010 - 17:38 #8
Jeg havde godt set det eksempel via en søgning, men jeg var egentlig ude efter et mere simpelt et. Eller også kunne jeg blot benytte det, jeg har allerede. Det har virket, så det burde kunne fungere igen.
Avatar billede arne_v Ekspert
21. december 2010 - 02:01 #9
Den paintComponent metode er på 6 linier.

Jeg tror ikke at du finder noget simplere.
Avatar billede kkaen Nybegynder
21. december 2010 - 08:30 #10
Hov, ja, du har da så ganske ret. I min hast lagde jeg primært mærke til billedet på siden, så en lille smule kode, og fik så (fejlagtigt) opfattelsen af, at det var et eksempel på en drag&drop-applikation med noget label-halløj. Og da jeg havde set det eksempel på drag&drop med det billede over sig (som jeg ikke kunne bruge til ret meget i sin tid) antog jeg, at det var det samme.
Men dette eksempel giver da faktisk ved nærmere eftersom lidt at tænke over :-)
Avatar billede kkaen Nybegynder
21. december 2010 - 11:11 #11
Du har tidligere givet mig et link til et kort eksempel på en drag&drop-funktion på en jLabel, men jeg kan ikke finde det link nu.
Der skulle vel ikke være mulighed for, at du vil fortælle mig det link igen?

Alle de eksempler jeg kan finde på drag&drop med jLabel kan jeg nemlig ikke få til at virke 100%. Muligvis kan jeg godt trække jLabellen rundt, men jeg kan ikke droppe den, og så trække videre på den igen...
Avatar billede kkaen Nybegynder
21. december 2010 - 11:49 #12
Nu har jeg fået lavet det sådan, at jeg godt kan trække jLabel rundt. Problemet er blot, at den grafisk repræsentation af jLabelen ikke er der - hverken når den trækkes rundt eller når den droppes.
Avatar billede kkaen Nybegynder
22. december 2010 - 09:11 #13
Det er nu lykkedes mig, at kunne trække jLabellen rundt i GUI'et. Problemet er blot, at jLabellen bliver renderet neden under de andre controller - f.eks. jPanels og jComboBoxes.
Hvis jeg i mouseDragged skriver:

dragComponent.setLocation(me.getX() + xAdjustment, me.getY() + yAdjustment);
//mainPanel.repaint();
this.dragComponent.repaint();

Så bliver jLabellen renderet øverst. Men så bliver de nederste controller ikke opdateret - altså kommer der en lang grå streg efter jLabellen, hvor den er blevet trukket.
Hvis jeg sætter
mainPanel.repaint();
i aktion, så bliver de nederste controller renderet rigtigt - men så bliver jLabellen ikke synlig, når den trækkes hen over andre controller.

Findes der nogle smarte løsninger på dette? Jeg kan ikke umiddelbart se sammenhængen...
Avatar billede kkaen Nybegynder
22. december 2010 - 09:28 #14
Hvis jeg manuelt sørger for at repainte de resterende controller efter repaint af jLabellen, så virker det.

jLabel2.repaint();
jPanel1.repaint();
jPanel2.repaint();
jPanel3.repaint();

Dog "blinker" jLabellen nogle gange under trækningen af den. Det fortæller mig, at renderingen af grafikken ikke er løst helt optimalt...?
Avatar billede arne_v Ekspert
25. december 2010 - 22:43 #15
Bruger du klasserne i java.awt.dnd til drop and drag?
Avatar billede kkaen Nybegynder
25. december 2010 - 23:11 #16
Siden sidst har jeg fundet et eksempel, hvor der benyttes klasser i "dnd" til at opnå det ønskede. Men da mit tidligere implementerede eksempel ikke benyttede dette, droppede jeg det hurtigt igen af frygt for, at det muligvis blot ville lede mig ud i endnu større problemer.
Avatar billede kkaen Nybegynder
25. december 2010 - 23:29 #17
...men det kunne da godt være, at jeg lige skulle forsøge at implementere dnd fra følgende url, i stedet for at bikse en løsning sammen helt fra bunden af:

http://download.oracle.com/javase/tutorial/uiswing/dnd/index.html
Avatar billede arne_v Ekspert
25. december 2010 - 23:38 #18
Det tror jeg.

Du kan godt få det andet til at virke funktionelt.

Men et blink problem kan nok være svært at fjerne, hvis man laver noget workaround.
Avatar billede kkaen Nybegynder
29. december 2010 - 13:50 #19
Nu har jeg læst det angivne link, og forsøgt at benytte det beskrevne. Men jeg kan ikke få det til at virke. Intet bliver tilsyneladende dragable.

Jeg har fulgt eksemplet her:
http://www.java2s.com/Code/Java/Swing-JFC/LabelDnDDragandDrop.htm

Og da jeg ikke kunne få det til at virke, forsøgte jeg at implementere første skridt i dragable-processen via dette eksempel:
http://www.java2s.com/Code/Java/Swing-JFC/MakingaComponentDraggable.htm

Men dette kan jeg heller ikke få til at blive dragable.

Min oprindelige applikation består af:
Form
|-MainPAnel
|-jPanel1
  |-jLabel1
|-jLabel2
|-jPanel2
  |-masser af komponenter
|-jPanel3
|-jLayeredPane2
  |-jLabel13
  |-jLabel14

Det er jLabel14, der skal være dragable, så den kan trækkes over på jPanel1.

Gode ideer (og vink med vognstange) påskønnes.
Avatar billede kkaen Nybegynder
10. januar 2011 - 18:16 #20
Arne-V :
Ligger du lige et "svar" ?
Avatar billede arne_v Ekspert
24. januar 2011 - 21:03 #21
ok
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