[Java] 2x een plaatje?

Pagina: 1
Acties:
  • 236 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
Heej programmeurs...

jullie zijn vast veel slimmer dan mij, en ik zit met een 'probleempje'...
probeer de applet gerust,.. het probleem is namelijk dat er 2x een plaatje word getekend (half over elkaar), terwijl er maar 1x staat dat hij de image moet tekenen...

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        
        final AffineTransform identity = new AffineTransform();
        AffineTransform at = new AffineTransform();
        
        g2d.setTransform(identity);
        at.translate((shape.getCenterX() - (image.getWidth(this) / 2)), (shape.getCenterY() - (image.getHeight(this) / 2)));
        g2d.drawImage(image, at, this);
        
        g2d.setTransform(identity);
        g2d.draw(shape);
        
        g2d.setTransform(identity);
        g2d.setColor(Color.RED);
        g2d.draw(new Line2D.Double(new Point2D.Double(shape.getCenterX(), shape.getCenterY()), new Point2D.Double(shape.getCenterX(), shape.getCenterY())));
    }


ik ben nog een beetje nieuw in het tekenen van graphics, en kom er echt niet uit...
help? _/-\o_

P.s. voor het hele applet mail me maar oid :)

Acties:
  • 0 Henk 'm!

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
kzal toch nog maar ff de hele code erbij zetten :)
mss toch handiger...

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.Random;

/**
 * Class ShapeImageTest - write a description of the class here
 * 
 * @author (your name) 
 * @version (a version number)
 */
public class ShapeImageTest extends JApplet
{
    // instance variables - replace the example below with your own
    private Random random;
    private Image image;
    private Rectangle2D shape;

     /**
     * Called by the browser or applet viewer to inform this JApplet that it
     * has been loaded into the system. It is always called before the first 
     * time that the start method is called.
     */
    public void init()
    {
        // this is a workaround for a security conflict with some browsers
        // including some versions of Netscape & Internet Explorer which do 
        // not allow access to the AWT system event queue which JApplets do 
        // on startup to check access. May not be necessary with your browser. 
        JRootPane rootPane = this.getRootPane();    
        rootPane.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
    
        // provide any initialisation necessary for your JApplet
        random = new Random();
        image = getImage(getCodeBase(), "blabber.gif");
    }

    /**
     * Called by the browser or applet viewer to inform this JApplet that it 
     * should start its execution. It is called after the init method and 
     * each time the JApplet is revisited in a Web page. 
     */
    public void start()
    {
        shape = new Rectangle2D.Double(30 + (40 *random.nextDouble()), 30 + (40 * random.nextDouble()), 400 * random.nextDouble(), 400 * random.nextDouble());
    }

    /** 
     * Called by the browser or applet viewer to inform this JApplet that
     * it should stop its execution. It is called when the Web page that
     * contains this JApplet has been replaced by another page, and also
     * just before the JApplet is to be destroyed. 
     */
    public void stop()
    {
        // provide any code that needs to be run when page
        // is replaced by another page or before JApplet is destroyed 
    }

    /**
     * Paint method for applet.
     * 
     * @param  g   the Graphics object for this applet
     */
    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        
        final AffineTransform identity = new AffineTransform();
        AffineTransform at = new AffineTransform();
        
        g2d.setTransform(identity);
        at.translate((shape.getCenterX() - (image.getWidth(this) / 2)), (shape.getCenterY() - (image.getHeight(this) / 2)));
        g2d.drawImage(image, at, this);
        
        g2d.setTransform(identity);
        g2d.draw(shape);
        
        g2d.setTransform(identity);
        g2d.setColor(Color.RED);
        g2d.draw(new Line2D.Double(new Point2D.Double(shape.getCenterX(), shape.getCenterY()), new Point2D.Double(shape.getCenterX(), shape.getCenterY())));
    }

    /**
     * Called by the browser or applet viewer to inform this JApplet that it
     * is being reclaimed and that it should destroy any resources that it
     * has allocated. The stop method will always be called before destroy. 
     */
    public void destroy()
    {
        // provide code to be run when JApplet is about to be destroyed.
    }
}

Acties:
  • 0 Henk 'm!

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
ik heb het gevoel dat het komt door de volgende regel:

Java:
1
at.translate((shape.getCenterX() - (image.getWidth(this) / 2)), (shape.getCenterY() - (image.getHeight(this) / 2)));


volgens mij geeft hij bij het bepalen van de X-coordinaat (image.getWidth(this)) meteen het plaatje op het scherm weer...
kan dit kloppen?
zo ja.. wat is er tegen te doen?

// edit

owh jah :x
DOM :P

[ Voor 5% gewijzigd door martennis op 10-08-2005 14:21 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Je kunt je post ook editen als je wilt ;)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • tekno
  • Registratie: September 2001
  • Laatst online: 31-08 15:27
Ik heb net even je applet overgenomen, met het enige verschil dat ik je plaatje niet heb, en dus een ander plaatje heb genomen. Maar hier wordt gewoon 1x het plaatje getekend en een mooie rechthoek. Kun je misschien een screenshot tonen van wat je probleem is, want met exact jouw code tekent hij hier dus gewoon plaatje met erover rechthoek.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:04
martennis, als je nog iets aan je topic wilt toevoegen, kan je beter de edit-knop gebruiken ipv het topic 2 keer te 'schoppen'.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
@tekno

ik zit nu even op een andere pc, zodra ik weer thuis ben zet ik een screen hier neer...

@mod

jah sorry :)
was het even vergeten :)

// EDIT

hier is een screenie van hoe het .gif plaatje eruit ziet:
Afbeeldingslocatie: http://members.lycos.nl/martennis/screens/blabber.gif

hier is screen van het resultaat:
Afbeeldingslocatie: http://members.lycos.nl/martennis/screens/fout.GIF

Ik ben er ook achter gekomen, dat wanneer ik de applet even minimaliseer, en dan weer tevoorschijn haal, dat de 'achterste' van de plaatjes dan opeens is verdwenen... :S
weet iemand hoe dat komt?

[ Voor 62% gewijzigd door martennis op 10-08-2005 21:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb het idee dat je teveel dingen tegelijk doet.. Het tekenen van een image is een stuk simpeler :) Even zoeken op de site van Sun levert je heel wat op!

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
maar de bedoeling van een AffineTransform is tch, dat je de transform reset elke keer als je hem hebt veranderd?
op deze manier kun je toch het volgende plaatje/shape op een 'schone' transform zetten?

Verwijderd

martennis schreef op donderdag 11 augustus 2005 @ 08:01:
maar de bedoeling van een AffineTransform is tch, dat je de transform reset elke keer als je hem hebt veranderd?
op deze manier kun je toch het volgende plaatje/shape op een 'schone' transform zetten?
Ik begrijp niet wat je hiermee bedoelt.. De omschrijving van het probleem zegt alleen maar dat er 2 keer een plaatje wordt getekend, dan geef ik tips over het tekenen van een plaatje :) Als jij andere dingen van plan was (transformeren) en daardoor gaat het tekenen fout, dan moet je dat wel duidelijk omschrijven.

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
mjah..

ik bedoelde eerder.. er staan op die sites die jij gaf telkens maar 1 plaatje/shape...
als je meerdere wilt tekenen (en deze wil verplaatsen / transformeren) doe je dat door een AffineTransform (toch? :))

enfin..
ik gok dat de code gewoon goed is, maar dat om de een of andere reden af en toe het plaatje 2x wordt weergegeven...
(want het gebeurd nu ook niet elke keer meer :S)

bedankt iig :)
kweet nu dat ik op de goede weg zit (:>

Verwijderd

Hij zal wel 2 keer painten ofzo.

graphics.clearRect(0, 0,this.width, this.heigth) oid(zie api) boven aan je paint zetten.

  • Wmm
  • Registratie: Maart 2002
  • Laatst online: 19-09 09:58

Wmm

Als je kijkt naar de documentatie van image.getHeight(observer) dan lees je dit:

code:
1
2
3
public abstract int getHeight(ImageObserver observer)

Determines the height of the image. If the height is not yet known, this method returns -1 and the specified ImageObserver object is notified later.


En dat is jouw probleem. Het plaatje laadt niet altijd snel genoeg, als hij niet snel genoeg laadt is de hoogte of breedte nog niet bekend en geeft ie -1 terug, hij gaat dan alsnog aan het werk en zodra het wel bekend is wordt dat alsnog bekend gemaakt en tekent hij hem nog een keer. Dat gebeurt er dus bij jou (en dat is ook de reden dat je het verkeerde plaatje kwijt bent als je minimaliseert en dan weer tevoorschijn haalt, hij tekent dan opnieuw en dan gaat het wel goed.

Je kunt dit probleem oplossen door gebruik te maken van een MediaTracker die je opdracht geeft te wachten tot het hele plaatje geladen is voordat je applet verder gaat, maar dat mag je zelf opzoeken. Is heel simpel :).

  • Johnny
  • Registratie: December 2001
  • Laatst online: 21-09 14:39

Johnny

ondergewaardeerde internetguru

Ik zou geen moeite doen met MediaTracker, gewoon ImageIO en BufferedImage gebruiken, dat is gewoon de "aanbevolen" manier, de rest is allemaal nodeloos ingewikkeld.

Java:
1
BufferedImage image = ImageIO.read("blabber.gif");

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Verwijderd

Johnny schreef op donderdag 11 augustus 2005 @ 20:18:
Ik zou geen moeite doen met MediaTracker, gewoon ImageIO en BufferedImage gebruiken, dat is gewoon de "aanbevolen" manier, de rest is allemaal nodeloos ingewikkeld.

Java:
1
BufferedImage image = ImageIO.read("blabber.gif");
Daar ben ik het helemaal mee eens :) Als je 2 keer een plaatje wilt tekenen dan roep je toch gewoon 2 keer drawImage() aan met een verschillende positie!

  • Wmm
  • Registratie: Maart 2002
  • Laatst online: 19-09 09:58

Wmm

Klopt inderdaad. Ik heb getwijfeld om dat hier neer te pennen, maar vond dit de makkelijkste en snelste oplossing voor de topicstarter. Als hij een BufferedImage gaat gebruiken moet hij nog meer andere klassen gaan gebruiken en try/catch stuff gebruiken :).
BufferedImage is verder wel de makkelijkste weg idd.

Maar dit:
Java:
1
BufferedImage image = ImageIO.read("blabber.gif");

klopt niet. ImageIO.read() vraagt een File, ImageInputStream, InputStream of URL object als parameter en dus geen String zoals hierboven :).
Ik snap wel dat jullie het weten, ik zeg het meer voor de topicstarter :).

Acties:
  • 0 Henk 'm!

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
Wmm heeft gelijk ;)
ik had al gekeken of ik het met de BufferedImage klaase kon doen, alleen bij de drawImage() methode heb je dan een instantie nodig van de BufferedImageOp (?)

wat ik vreemd vond, omdat deze klasse een interface is zonder constructor ed.

maar ik zal beide wegen nog maar eens goed gaan bekijken.

bedankt!

Acties:
  • 0 Henk 'm!

  • Wmm
  • Registratie: Maart 2002
  • Laatst online: 19-09 09:58

Wmm

martennis schreef op vrijdag 12 augustus 2005 @ 09:24:
Wmm heeft gelijk ;)
ik had al gekeken of ik het met de BufferedImage klaase kon doen, alleen bij de drawImage() methode heb je dan een instantie nodig van de BufferedImageOp (?)

wat ik vreemd vond, omdat deze klasse een interface is zonder constructor ed.

maar ik zal beide wegen nog maar eens goed gaan bekijken.

bedankt!
Nee, dat hoeft niet. Je kunt gewoon dezelfde methode drawImage blijven gebruiken (met dezelfde parameters dus). Kijk maar eens in de documentatie welke methodes Graphics2D nog meer erft van java.awt.Graphics :). Houd dan wel in het achterhoofd dat een BufferedImage eigenlijk een Image is(dus waar ze een Image vragen bij drawImage kun je ook een BufferedImage gebruiken). En daarmee komen we bij je vraag over de instantie van BufferedImageOp. Hij vraagt niet een instantie van de interface BufferedImageOp maar van een klasse die BufferedImageOp implementeert. Deze dingen (Image en BufferedImageOp) hebben te maken met overerving e.d., je moet je daar maar eens in verdiepen dan want zulke dingen als dit ga je constant tegenkomen :).

Acties:
  • 0 Henk 'm!

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 07-07 10:36
ok thnx :)
Pagina: 1