Toon posts:

[Java] paint in meerdere classes?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben nog niet zo heel erg bedreven in java, heb mijn eerste kwartiel achter de rug, en ik moet een soort interface maken met beeld, geluid en animatie. ALles gaat goed tot ik aan de animatie begin.
Het is de bedoeling dat een regel tekst van links naar rechts beweegt. Ik wilde dat doen met een teller, die om de 0.2 sec + 1 bij waarde "teller" voert, om de waarde teller dan als horizontale begincoordinaat vi jde regel te gebruiken en deze later weer te resetten. Het probleem is, dat bij de functie repaint ALLE objecten uit public paint ge-repaint worden, en dat is een beetje irritant. :9

Daarom dacht, dan maak ik een extra class, met daarin alleen die zin, wat ik nu heb is:
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
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.applet.Applet;


public class H20 extends Applet implements ActionListener {
    
    private Image image, imageF, FMI;
    private Button play, loop, stop, fart;
    private AudioClip sound, sfx;
    private int counter;
        
    public void init() {
        image = getImage(getDocumentBase(), "milk.gif");
        imageF = getImage(getDocumentBase(), "fart.gif");
        FMI = getImage(getDocumentBase(), "FMI.gif");
        
        play = new Button("Play");
        add(play);
        play.addActionListener(this);
        loop = new Button("Loop");
        add(loop);
        loop.addActionListener(this);
        stop = new Button("Stop");
        add(stop);
        stop.addActionListener(this);
        fart = new Button("Fart!");
        add(fart);
        fart.addActionListener(this);
        sound = getAudioClip(getDocumentBase(), "music.wav");
        sfx = getAudioClip(getDocumentBase(), "sfx.wav");
    }


    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == play)
            sound.play();
        if (event.getSource() == loop)
            sound.loop();
        if (event.getSource() == stop)
            sound.stop();
        if (event.getSource() == fart) {
            counter = 1;
            sfx.play();
            repaint();
        }
        
    }           
    
    
    public void paint(Graphics g) {
        g.drawImage(FMI, 150, 130, 300, 50, this);
        if (counter == 0) {
            g.drawImage(image, 20, 20, 100, 100, this);
        }
        if (counter == 1) {
            g.drawImage(imageF, 20, 20, 168, 100, this);
            
            try { 
                Thread.sleep (600); 
            } 
         
            catch (InterruptedException e) {
            }
            
            counter = 0;
            repaint();
        }
    }

public class animatie {
    
    public int teller = 20;
    
    public void init() {
        teller++;
        if(teller == 200) {
            teller = 20;
        }
        repaint();
    }
    
    public void paint(Graphics g) {
        g.drawString("Welcome at the Farting Milkshake Interface, aka FMI", 20, 200);   
    }
}
}


Maar die public paint in de animatie classe doet helemaal niets. (ik heb de coordinaat pixels even vast gezet, dus niet als variable "teller" bij de regel die moet bewegen, welcome at the Farting..., om te controleren of hij iets liet zien)
Weet iemand misschien waarom niet? Ik denk dat je geen 2 paint functies kan hebben, maar ik zou niet weten hoe je het anders moet doen... (8>

[ Voor 16% gewijzigd door curry684 op 02-11-2003 21:28 ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Je Animatie-klasse (het is gebruikelijk de eerste letter van een klassenaam te kapitaliseren overigens) moet java.awt.Component extenden. Daardoor kan je 'm toevoegen aan je GUI met add(Component) en zal de GUI-manager automatisch de paint() van je Animatie aan te roepen.

Ik raad je aan nog even flink wat te lezen over GUI's in Java, want de fouten die je maakt geven er blijk van (no offense uiteraard) dat je daar nog behoorlijk weinig van snapt. :)

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
nee klopt :) ben allang blij dat ik zie wat ik wil zie... behalve dit dan :)
ZOu je misschien een voorbeeldje kunnen geven met dat component extenden? Ben al druk over GUI's aant lezen, maar ben nog geen steek verder :) (waar kan ik die add optie vinden die je beschrijft)

[ Voor 57% gewijzigd door Verwijderd op 02-11-2003 22:07 ]


  • nxt
  • Registratie: November 2001
  • Laatst online: 12-06 10:00

nxt

Verwijderd schreef op 02 november 2003 @ 22:01:
nee klopt :) ben allang blij dat ik zie wat ik wil zie... behalve dit dan :)
ZOu je misschien een voorbeeldje kunnen geven met dat component extenden? Ben al druk over GUI's aant lezen, maar ben nog geen steek verder :) (waar kan ik die add optie vinden die je beschrijft)
die add method is dezelfde als waarmee je bijvoorbeeld in je huidige applet de buttons toevoegd
echter, die zal alleen maar instanties van classes accepteren die afstammen van component. in dit geval zal je eigen class 'animatie' niet voldoende zijn,
als je dat nu 'public class animatie' veranderd in: 'public class Animatie extends Canvas'
zal het wel lukken.
maar dan moet je nog steeds ergens (net zoals met je buttons) een instantie van die class aanmaken en toevoegen aan je applet.

een ander alternatief is om in de paint method van je applet de paint method van de animatie class aan te roepen.

Als je later in plaats van AWT componenten swing componenten gaat gebruiken, is het handiger om in plaats van Canvas te extenden (en de paint method overriden) een JPanel te extenden (en dan de paintComponent method te overriden).

offtopic:
p.s. zoals al gezegt, het is gebruikelijk om class names met een hoofdletter te laten beginnen en de namen van variabeles met een kleine letter

[ Voor 3% gewijzigd door nxt op 02-11-2003 22:48 ]


Verwijderd

Topicstarter
PHP:
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
94
95
96
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.applet.Applet;


public class H20 extends Applet implements ActionListener {
    
    private Image image, imageF, FMI;
    private Button play, loop, stop, fart;
    private AudioClip sound, sfx;
    private int counter;
    private Animatie animatie;
                        
    public void init() {
        image = getImage(getDocumentBase(), "milk.gif");
        imageF = getImage(getDocumentBase(), "fart.gif");
        FMI = getImage(getDocumentBase(), "FMI.gif");
        
        play = new Button("Play");
        add(play);
        play.addActionListener(this);
        loop = new Button("Loop");
        add(loop);
        loop.addActionListener(this);
        stop = new Button("Stop");
        add(stop);
        stop.addActionListener(this);
        fart = new Button("Fart!");
        add(fart);
        fart.addActionListener(this);
                    
        sound = getAudioClip(getDocumentBase(), "music.wav");
        sfx = getAudioClip(getDocumentBase(), "sfx.wav");
    }


    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == play)
            sound.play();
        if (event.getSource() == loop)
            sound.loop();
        if (event.getSource() == stop)
            sound.stop();
        if (event.getSource() == fart) {
            counter = 1;
            sfx.play();
            repaint();
        }
    }           
    
    
    public void paint(Graphics g) {
        g.drawImage(FMI, 150, 130, 300, 50, this);
        if (counter == 0) {
            g.drawImage(image, 20, 20, 100, 100, this);
        }
        if (counter == 1) {
            g.drawImage(imageF, 20, 20, 168, 100, this);
            
            try { 
                Thread.sleep (600); 
            } 
         
            catch (InterruptedException e) {
            }
            
            counter = 0;
            repaint();
        }
    }
}

class Animatie extends Canvas {
    
    public int teller = 20;
    
    public void init() {
    }

    public void paint(Graphics g) {
        teller++; 
        if(teller == 200) { 
            teller = 20;                
        } 
        try {  
            Thread.sleep (200);  
            }  
          
            catch (InterruptedException e) { 
            } 
        
        repaint();       
        g.drawString("Welcome to Java!!", teller, 260 );
    }
}


De classen werken afzonderlijk allebij (de animatie dan wel als main class, dus stand alone) maar ik als ik Animatie als class toevoeg dan krijg ik geen foutmeldingen, maar ook niet de tekst Welcome to Java... strange.. Zoals je al zei, ik moet hem nog adden in de applet, maar waar/hoe doe ik dat? :S
Volgens mij moet hij het hierna wel doen (als ik hem tenminste, net als de buttons, ergens weet te adden :))

[ Voor 59% gewijzigd door Verwijderd op 02-11-2003 23:47 ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Zo ongeveer:

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
public void init() { 
        image = getImage(getDocumentBase(), "milk.gif"); 
        imageF = getImage(getDocumentBase(), "fart.gif"); 
        FMI = getImage(getDocumentBase(), "FMI.gif"); 
         
        play = new Button("Play"); 
        add(play); 
        play.addActionListener(this); 
        loop = new Button("Loop"); 
        add(loop); 
        loop.addActionListener(this); 
        stop = new Button("Stop"); 
        add(stop); 
        stop.addActionListener(this); 
        fart = new Button("Fart!"); 
        add(fart); 
        fart.addActionListener(this); 

        // Begin Animatie-toevoegcode
        Animatie anim = new Animatie();
        add(anim);
        // Einde Animatie-toevoegcode
                     
        sound = getAudioClip(getDocumentBase(), "music.wav"); 
        sfx = getAudioClip(getDocumentBase(), "sfx.wav"); 
    } 


Oja, je kan je code beter tussen ]code=java[ tags zetten dan tussen ]code=php[ ;) .

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
oh, wist niet dat dat kon :)

Verwijderd

Topicstarter
heb je hem zo geprobeerd? want met die line erbij, doet hij nog steeds hetzelfde.

Moet er in de paint van de main class niet iets staan van animatie.paint(g);? Want als ik dat doe, dan krijg ik in de dos prompt (weet niet hoe dat schermpje heet :)) achter je applet als je hem runned, allemaal foutmeldingen...

Ik snap er echt de ballen van :) Raak hier een beetje gefrustreerd :P

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

edit:
Het is natuurlijk paint(Graphics) en niet paint(void)... :D


Roep in je eigen hoofd-paint eens
Java:
1
super.paint(g);

aan als allereerste statement in de functie.

Ik ga nu niet precies uitleggen waarom dat moet, want dan ben ik veel te lang bezig :) .

Je gebruikt de oude AWT classes om GUI's te maken. Daar is op zich niks mis mee, maar eigenlijk wil Sun liever dat je de Swing classes gebruikt (die zijn ook veel beter). Dit heeft tot gevolg dat Sun de oude AWT tutorial van het web heeft gehaald en die is alleen nog maar te downloaden (3,1 MB). Ik raad je sterk aan die even door te nemen.

Succes ermee! :)

[ Voor 8% gewijzigd door Eelke Spaak op 03-11-2003 16:17 ]

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
het is uiteindelijk gelukt, ik heb het met een Thread opgelost. Heb er wel tot 03.15 mee bezig geweest maar het werkte uiteindelijk wel! Bedankt voor alle info!
Pagina: 1