Toon posts:

[Java] Canvas is niet leeg bij creatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende java-klasse geschreven die moet functioneren als canvas:

code:
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
53
54
55
56
57
58
59
60
61
62
63
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;

class ImageCanvas extends Canvas
{
    private Image image;
    
    
    public void ImageCanvas()
    {
        setSize(new Dimension(100, 100));
    }
    
    public void update(Graphics g)
    {
        paint(g);
    }

    public void initImage()
    {
        image = createImage(100, 100);
    }
    
    
    public void setImage(Image i)
    {
        image = i;
        if (i.getWidth(this) > i.getHeight(this))
            setSize(i.getWidth(this),i.getWidth(this));
        else
            setSize(i.getHeight(this),i.getHeight(this));
        repaint();
    }
    
    public Image getImage()
    {
        return image;
    }

    public int getWidth()
    {
        if (image != null)
            return image.getWidth(this);
        else
            return 0;
    }

    public int getHeight()
    {
        if (image != null)
            return image.getHeight(this);
        else
            return 0;
    }
    
    public void paint(Graphics g)
    {
        if (image != null)
            g.drawImage(image, 0, 0, this);
    }
}


De bedoeling is dat het overkoepelende programma eerst zo'n canvas creëert en deze pas vult met een plaatje wanneer de gebruiker op een knop drukt. Dit werkt wel, maar de canvas is in de eerste instantie (dus voordat er op de knop is gedrukt) niet leeg! :( Ik zie stukken van de achterliggende applicaties, i.p.v. bijv. een wit egaal vlak.
Weet iemand hoe ik dit moet oplossen?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

wellicht moet je nog in je paint-methode een super.paint() plaatsen?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
Je stuurt zelf op het antwoord aan: als (image == null), zul je een wit vlak moeten tekenen. Dat doet update() normaal gesproken voor je, maar die heb je nu zelf vervangen door een versie direct paint aanroept, zonder eerst het tekenveld te wissen.

Het meest handige is misschien om er dit van te maken:
Java:
1
2
3
4
5
6
7
public void update(Graphics g)
{
    if (image == null)
        super.update(g);
    else
        paint(g);
}

Op deze manier wist de update() methode de achtergrond op de voor jouw platform gebruikelijke manier, tenzij er een plaatje beschikbaar is.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
ACM schreef op 11 February 2003 @ 15:05:
wellicht moet je nog in je paint-methode een super.paint() plaatsen?
Hoe kom je daar nu weer bij? De normale implementatie van paint() is gewoon leeg (bestaat alleen maar zodat je 'm zelf niet hoeft te implementeren). Je kunt beter in de AWT documentatie kijken hoe het tekenen van componenten werkt, dan blindelings gekke dingen uitproberen.

Verwijderd

Topicstarter
Sorry Soultaker, dat werkt helaas niet. Het resultaat is nog steeds hetzelfde...
Zal ik iets met clearRect moeten doen, of zo?

[ Voor 3% gewijzigd door Verwijderd op 11-02-2003 15:17 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Soultaker schreef op 11 February 2003 @ 15:08:
Je stuurt zelf op het antwoord aan: als (image == null), zul je een wit vlak moeten tekenen. Dat doet update() normaal gesproken voor je, maar die heb je nu zelf vervangen door een versie direct paint aanroept, zonder eerst het tekenveld te wissen.

Canvas.update() tekent geen wit vlak, maar een doet een clearRect( ) en roept daarna paint() aan. Maw hij gooit er een vlak overheen, met de achtergrondkleur
Soultaker schreef op 11 February 2003 @ 15:10:
Hoe kom je daar nu weer bij? De normale implementatie van paint() is gewoon leeg (bestaat alleen maar zodat je 'm zelf niet hoeft te implementeren). Je kunt beter in de AWT documentatie kijken hoe het tekenen van componenten werkt, dan blindelings gekke dingen uitproberen.
Da's dus bij Swing wel zo. Als ik een JPanel extend en daar op wil tekenen roep ik eerst super.paintComponent() aan, dit omdat Swingcomps. zichzelf tekenen. Vandaar waarschijnlijk de verwarring bij ACM (wie gebruikt er nou nog AWT :+ )
BTW Canvas.paint() is niet totaal leeg hoor (hoewel het geen kont scheelt though)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
     * Paints this canvas. 
     * <p>
     * Most applications that subclass <code>Canvas</code> should 
     * override this method in order to perform some useful operation 
     * (typically, custom painting of the canvas).  
     * The default operation is simply to clear the canvas.  
     * Applications that override this method need not call 
     * super.paint(g).  
     * 
     * @param      g   the specified Graphics context
     * @see        #update(Graphics)
     * @see        Component#paint(Graphics)
     */
    public void paint(Graphics g) {
        g.clearRect(0, 0, width, height);
    }


Als de topicstarter componenten door zijn AWT component heen ziet, dan kan dat dacht ik een aantal dingen betekenen
1) Je hebt geen backgroundColor neergezet
2) Je mixt Swing/AWT components.

2 Lijkt me redelijk onwaarschijnlijk (ik zie alleen awt includes) dus ik zou eens een setBackground( Color.WHITE ) in de constructor neerzetten :)
Zeker weten doe ik het allemaal niet meer, is allemaal een tijd geleden :)
Pagina: 1