Toon posts:

[Java] Graphics object maken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe maak ik een Graphics object aan?
Dit werkt niet:
code:
1
Graphics my_graphics = new Graphics();

Ik weet al waarom, want het is een abstract class volgends de manual. Maarja verder dan dat snap ik niet wat ik moet doen.
Werken met .getGraphics() lukt me ook niet om een Graphics object aan te maken.
Ik zal even de situaatie uitleggen:
class1 extends Applet, roept class2 aan om een graphics object te maken.
class1 roept daarna class3 aan om een andere graphics object te maken.
class1 voegt de graphics daarna samen en geeft het weer in de applet.

class2 en class3 moeten dus niet extends Applet hebben om bijvoorbeeld met paint(Graphics g) te werken vind ik. Wat is nu de simpelste oplossing? Ik heb al dingen gelezen over Jframes, maar dat vind ik zelf nogal overdreven en lijkt me een omweg. Waarom is het zo moeilijk om gewoon een Graphics object aan te maken?

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 10-05 16:41

Nick_S

++?????++ Out of Cheese Error

Je moet werken met het Graphics object wat je in je paint functie mee krijgt. Dit object kun je wel doorgeven aan andere klassen, zodat die er ook mee kunnen werken.

Je kan zelf geen Graphics object aanmaken omdat het inderdaad een abstract klasse is. Je zal onder windows een ander Graphics object hebben als onder bijv. Linux.

Daarom kun je deze niet zelf initialiseren, maar krijg je deze altijd mee.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Wat probeer je precies te doen? Wil je dat klasse 2 & 3 iets maken en dat het vervolgens in klasser 1 wordt getekend? Waarom moeten klasse 2 & 3 een eigen Graphics object aanmaken? Je kan toch via een methode (of de constructor van klasse 2 & 3) de Graphics van klasse 1 doorgeven m.b.v getGraphics()?

Misschien dat je een wat duidelijker voorbeeld moet geven. Als je namelijk de manier van Graphics weergeven niet goed begrijpt kan het al snel fout gaan (Nullpointers / niks op het scherm zien) :)

Verwijderd

Topicstarter
Okay dus in plaats van zoiets:

public void paint(Graphics g)
{
Map my_map = new Map();
bufferGraphics = my_map.getMap();
g.drawImage(offScreenBuffer,0,0,this);
}

Moet het zoiets worden:

public void paint(Graphics g)
{
Map my_map = new Map();
bufferGraphics = my_map.getMap(g);
g.drawImage(offScreenBuffer,0,0,this);
}

toch?

Verwijderd

Topicstarter
Verwijderd schreef op maandag 21 februari 2005 @ 20:35:
Wat probeer je precies te doen? Wil je dat klasse 2 & 3 iets maken en dat het vervolgens in klasser 1 wordt getekend?
Precies
Waarom moeten klasse 2 & 3 een eigen Graphics object aanmaken? Je kan toch via een methode (of de constructor van klasse 2 & 3) de Graphics van klasse 1 doorgeven m.b.v getGraphics()?
okay ik begin het denk ik al beter te snappen. Ik zal even wat dingen proberen.
Misschien dat je een wat duidelijker voorbeeld moet geven. Als je namelijk de manier van Graphics weergeven niet goed begrijpt kan het al snel fout gaan (Nullpointers / niks op het scherm zien) :)
Ik zal het inderdaad nog niet goed begrijpen :) Maar ik leer al aardig wat.

Verwijderd

Als getMap() een Graphics object verwacht, dan is dat inderdaad goed. Alleen wordt er nu steeds bij elke repaint() een nieuwe Map my_map aangemaakt, omdat bij een repaint() de methode paint(Graphics g) wordt aangeroepen.

Je kunt dus beter Map my_map in je init() neerzetten :)

Overigens is het netter als je je java code tussen de [*code=java] //hier je code[*/code] tags neer te zetten, dan krijg je zoiets:

Java:
1
2
3
public void voorbeeld() {
    //hier je code
}


Uiteraard de tags zonder * asterix :)

[ Voor 32% gewijzigd door Verwijderd op 21-02-2005 20:45 ]


Verwijderd

Topicstarter
ja ik had het in de init zitten, maar dan wil hij niet compilen, snap zelf niet waarom maar dat vind ik op het moment niet zo belangrijk. repaint() zal toch niet zo vaak gebeuren nog ook al dubbel buffer ik al wel :)

edit...
dit werkt niet, want hij wil niet compilen:
Java:
1
2
3
4
5
6
public void paint(Graphics g) 
 {
  Map my_map = new Map();  
  bufferGraphics = my_map.getMap(g);
  g.drawImage(offScreenBuffer,0,0,this);
 }

Map class:
Java:
1
2
3
4
5
6
public Graphics getMap(Graphics g)
 {
  g.setColor(Color.red);
  g.drawString("Een tekst",10,10); 
  return g;
 }

[ Voor 53% gewijzigd door Verwijderd op 21-02-2005 21:29 ]


Verwijderd

Als ik het goed heb onthouden dan wordt er ook automatisch gerepaint bij het verplaatsen van je scherm, resizen en ALT-tabben. Vandaar dat ik het zei (probeer maar eens met een System.out.println) :)

Verwijderd

Verwijderd schreef op maandag 21 februari 2005 @ 21:00:
dit werkt niet, want hij wil niet compilen:
Java:
1
2
3
4
5
6
public void paint(Graphics g) 
 {
  Map my_map = new Map();  
  bufferGraphics = my_map.getMap(g);
  g.drawImage(offScreenBuffer,0,0,this);
 }

Map class:
Java:
1
2
3
4
5
6
public Graphics getMap(Graphics g)
 {
  g.setColor(Color.red);
  g.drawString("Een tekst",10,10); 
  return g;
 }
Waarom doe je 'return g'?

Als je g.drawString doet, dan tekent hij al op 'g'. Dus als het goed is komt het op het scherm te staan. Dan hoef je toch niet nog eens 'g' te returnen? Je moet er gewoon een void methode van maken en geen Graphics returnen.

Verwijderd

Topicstarter
Ja okay, maar dan kan ik het toch net zo goed (of misschien nog beter) een methode in Class1 maken?

Verwijderd

Dat kan inderdaad, maar omdat ik niet weet hoe jouw programma in elkaar zit kan ik je slechts helpen met hetgeen wat hier gepost is :)

[ Voor 3% gewijzigd door Verwijderd op 21-02-2005 21:43 ]


Verwijderd

Topicstarter
Veel meer dan wat ik heb gepost is het niet :)

Ik had het eerst allemaal in 1 class zitten met methodes, maar ik wilde het splitsen omdat het anders misschien te groot en onoverzichtelijk werd. Maarja zo te zien kun je het beste alle graphics in 1 class afhandelen en ze niet splitsen in verschillende classes.

Ik zal even alles posten wat ik heb. Er is al heel veel wegehaalt omdat ik het eerst simpel wil laten werken en daarna weer uitbreiden. Class3 bestaat bijvoorbeeld nog niet.

Buffer.java (dit is class1)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.applet.*;
import java.awt.event.*;
import java.awt.*;

public class Buffer extends Applet implements MouseMotionListener
{
 Graphics bufferGraphics;
 Image offScreenBuffer;
 Dimension dim;
 int curX, curY;

 public void init() 
 {
  dim = getSize();
  addMouseMotionListener(this);
  setBackground(Color.black);
  offScreenBuffer = createImage(dim.width,dim.height);
  bufferGraphics = offScreenBuffer.getGraphics();
 }

 public void paint(Graphics g) 
 {
  Map my_map = new Map();  
  bufferGraphics = my_map.getMap(g);
  g.drawImage(offScreenBuffer,0,0,this);
 }

 public void update(Graphics g)
 {
  Graphics gr; 
  if (offScreenBuffer==null ||
  (! (offScreenBuffer.getWidth(this) == dim.width
  && offScreenBuffer.getHeight(this) == dim.height)))
  {
   offScreenBuffer = this.createImage(dim.width, dim.height);
  }
  gr = offScreenBuffer.getGraphics();
  paint(gr);
  g.drawImage(offScreenBuffer, 0, 0, this);
 }
 
 public void mouseMoved(MouseEvent evt) 
 {
  curX = evt.getX();
  curY = evt.getY();
  repaint();
 }
 
 public void mouseDragged(MouseEvent evt) 
 {
 }
}


Map.java (dit is class2)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.awt.*;
import javax.swing.*;

public class Map
{

 public Map()
 {
 }

 public Map(int width, int height)
 {
 }

 public void setMap()
 {
 }

 public void getMap(Graphics g)
 {
  g.setColor(Color.red);
  g.drawString("Een tekst",10,10); 
 }

}

[ Voor 3% gewijzigd door Verwijderd op 21-02-2005 21:57 ]


  • Denker
  • Registratie: Maart 2003
  • Laatst online: 07-04 10:37
Heb je bewust niet voor gekozen om je classes in een package te zetten?

Verwijderd

Topicstarter
Denker schreef op maandag 21 februari 2005 @ 21:58:
Heb je bewust niet voor gekozen om je classes in een package te zetten?
Op het moment nog wel, maakt dat veel uit?

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Packages zijn vooral bedoeld om naamconflicten te voorkomen. Binnen een package moet de naam van je klasse uniek zijn maar een naam kan best in meerdere packages voorkomen. Daarnaast kun je met packages je klassen rangschikken. Dan houdt je het overzicht er een beetje in.

www.fendt.com | Nikon D7100 | PS5


Verwijderd

Topicstarter
Als je deze code in de Buffer class vervangt werkt het zoals het hoort:

Java:
1
2
3
4
5
6
7
8
public void paint(Graphics g) 
 {
  bufferGraphics.clearRect(0,0,dim.width,dim.width);
  bufferGraphics.setColor(Color.red);
  bufferGraphics.drawString("Een tekst",10,10);
  bufferGraphics.fillRect(curX,curY,20,20);
  g.drawImage(offScreenBuffer,0,0,this);
 }

Maar het stuk met:
Java:
1
2
3
4
5
 
  bufferGraphics.clearRect(0,0,dim.width,dim.width);
  bufferGraphics.setColor(Color.red);
  bufferGraphics.drawString("Een tekst",10,10);
  bufferGraphics.fillRect(curX,curY,20,20);

wil ik een andere class laten doen, en dat lukt me helemaal niet.

Verwijderd

Topicstarter
hahahaha hicham, het werkt nu! :)

Heel erg bedankt voor al je hulp. Hier de code (eigenlijk heel logisch :)):

Buffer.java:
Java:
1
2
3
4
5
6
public void paint(Graphics g) 
 {
  Map my_map = new Map();
  my_map.getMap(bufferGraphics, dim.width, dim.height);
  g.drawImage(offScreenBuffer,0,0,this);
 }

Map.java:
Java:
1
2
3
4
5
6
public void getMap(Graphics input, int width, int height)
 {
  input.clearRect(0,0,height,width);
  input.setColor(Color.red);
  input.drawString("Een tekst",10,10);
 }



edit:
Map my_map = new Map(); werkt nu ook in de init(). Ik had "Map my_map;" in het begin van de class vergeten te zetten :D

[ Voor 13% gewijzigd door Verwijderd op 21-02-2005 22:55 ]


Verwijderd

Ja, het is ook heel logisch. Je moet het alleen even doorhebben ;)

Verder zie ik dat je zelf een buffersysteem hebt 'geprogrammeerd' (zodat je geen knipperende animaties krijgt). Als je swing gebruikt dan wordt dit automatisch gedaan en hoef je dus niet de update() methode aan te passen. Ik weet alleen niet hoe dit met Applets werkt (heb alleen nog maar applicaties zitten maken in swing) maar als je volgens mij 'extends Applet' vervangt door 'extends JApplet' dan heb je automatische buffering. Misschien dat je nog stukjes code moet aanpassen bij het painten omdat het niet helemaal hetzelfde gaat zoals bij een Applet / Frame, maar je bent dan iig van die aangepaste update() code af (en dat offScreenBuffer gebeuren eromheen) :)

Verwijderd

Topicstarter
okay bedankt, ik zal er eens naar kijken. Er zijn denk ik een heleboel verouderde sites op internet dan :)
Pagina: 1