[Java] Een lijn tekenen in een jPanel

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 15:40
Goedemiddag tweakers,

Ik zit nu al uren te staren naar een probleem en na veel googelen kom ik er gewoon niet uit. Het komt er op neer dat ik, wanneer ik op een knop druk, gewoon een simpel lijntje wil tekenen.

Ik heb een JFrame met daarin een custom drawpanel die overerft van een jpanel. Mijn drawPanel override de paintComponent(Graphics g) methode en roept daar dezelfde methode van de super klasse aan.

Java:
1
2
3
  public void paintComponent(Graphics g){
    super.paintComponent(g);
  }


Wanneer ik daar g.drawLine(..) aanroep, tekent hij gelijk van eerst moment een lijn.

Echter wil ik dat hij een lijn tekent als ik op een knop druk.

Hoe doe ik dit? Wat ik ook doe, hij tekent gewoon geen lijnen buiten mijn paint methode.

Maarten

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

De knop zet een boolean op true en doet een repaint, in de paint methode teken je alleen een lijn als die ene boolean op true staat.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 15:40
Nou, ik weet niet wat ik ga tekenen. Dat wordt pas bekend als de code draait. Dus daarom kan ik het ook niet in die paint methode stoppen...

EDIT:

Dus het gaat niet zozeer om het moment waarop hij het tekent, alleen gaat het me om wat hij tekent. Uiteindelijk heb ik straks een textbox en daar tik bijvoorbeeld in: forward 100. Me code begrijpt nu al hoe hij daar mee moet omgaan, alleen nu krijg ik het niet voor elkaar om in java dan een lijn te laten tekenen.

[ Voor 53% gewijzigd door BlackHawkDesign op 13-03-2010 15:47 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Altijd handig, mensen die in hun topicstart niet meteen duidelijk zijn ;). Je zult toch ergens moeten bepalen wat er getekend moet worden. Je kunt dat stukje tekencode ook in een class gooien die een bepaalde interface implementeert. In het simpele geval bijvoorbeeld een class Line implements Paintable. De Paintable interface heeft dan simpelweg een draw(Graphics g) methode, en in de Line class implementeer je die door een lijn te tekenen.

Als er op de knop wordt gedrukt kun je die Line class instantieren en toevoegen aan een lijstje van Paintables. In de paint() ga je vervolgens dat lijstje af en roep je simpelweg de draw() methode aan voor al die objecten.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 19-09 01:03
Je moet gewoon invalidate() (was het geloof ik :X) aanroepen, en in de paint functie tekenen wat je wilt.
Als je niet weet wat je wilt tekenen kan je dat opvragen in de paintfunctie door gewoon andere functies aan te roepen, of anders nog eens grondig naar de hele opbouw kijken van het programma. Een normaal programma doet ongeveer dit:

Zodra op een knop gedouwt wordt:
- datazooi uitrekenen / fetchen / enzovoort
- painten

Als dat bij jou anders is zit er vooral een structurele fout imho.

/edit met .oisyn. Toch maar eens een pro-abbo nemen zodat ik ook snel kan posten.

[ Voor 10% gewijzigd door _eXistenZ_ op 13-03-2010 15:51 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 15:40
Ja sorry, ik probeerde het probleem zo simpel mogelijk te houden :9

Ik snap je oplossing, maar dat werkt toch behoorlijk omslachtig? Wat heb je dan nog aan de object.getGraphics() methode?

Zoiets als dit gaat dus totaal niet werken?

Java:
1
2
3
Graphics g = drawPanel.getGraphics();
g.setColor(Color.blue);
g.drawLine(0, 0, 200, 200);

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 19-09 01:03
getGraphics() is de lelijke manier. Je moet gewoon in paint(Graphics g) {} het Graphics-object g gebruiken die je aangeleverd krijgt, en daar tegen praten om te tekenen.

Die paintfunctie roep je niet zelf aan vanuit een ander stuk code maar op het moment dat je wilt hertekenen zeg je invalidate() en zal Java de paintfunctie aanroepen met als argument het Graphics-object.

[disclaimer] Mijn informatie komt van een half jaar BlackBerryOs-Java programmeren als onderdeel van afstudeerstage dus het kan zijn dat ik dingen roep die afwijken van de standaard J2EE- / J2ME-methodieken[/disclaimer]

[ Voor 20% gewijzigd door _eXistenZ_ op 13-03-2010 16:00 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 15:40
Naja lelijk, eigenlijk vul je gewoon je jpanel aan met je eigen tekening. Maar goed het wordt me al duidelijk dat ik gewoon met een omslachtige manier me tekening moet tekenen op me jpanel.

Bedankt allen voor jullie input, met name .oisyn, je uitleg was duidelijk :)

Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 19-09 01:03
Omslachtig valt wel mee. Als je namelijk je eigen classes maakt en die add, worden die ineens ook alelmaal netjes voor je getekent. Het kan meer dan alleen maar een lijntje tekenen, ook objecten managen enzo.

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 15:40
Ja in zon geval wel inderdaad, maar ik hoef alleen lijntjes te tekenen.

Het is iig nu duidelijk voor me. Ik kan weer verder :D Thnx heren.
Pagina: 1