Toon posts:

[java]twee grafieken tekenen ipv 1

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

Verwijderd

Topicstarter
Ik heb hier een java applicatie, waar ik realtime grafieken moet gaan tekenen. Echter, als ik één grafiek laat tekenen, kan ik er niet nog één tekenen. Ik snap alleen niet waarom niet.

Dit is zeg maar het relevante gedeelte uit de applicatie
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
import java.awt.*;
import java.awt.event.*;
import java.lang.*;

public class TestKlasse extends Frame {
    private Button start;
    private boolean analyse;   
    private Grafiek grafiekje, grafiekje2;

    public TestKlasse() {        
        setLayout( null );
        setBackground( Color.lightGray);
        addWindowListener( new VensterHandler() );
        
        analyse = false;

        //De start/stop knop
        start = new Button( "start" );
        start.setBounds( 385, 250, 70, 40 );
        start.addActionListener( new KnopHandler() );
        add( start );
        //Einde knop

        grafiekje = new Grafiek( 100, 75, 220, 110, 140 );
        grafiekje2 = new Grafiek( 100, 255, 220, 110, 140 );
    }
    
    public void paint( Graphics g ){ 
        //ruimte voor grafiek
        g.setColor( Color.white );
        g.fillRect( 95, 90, 220, 110 );          
        
        //ruimte voor grafiek2
        g.setColor( Color.white );
        g.fillRect( 95, 260, 220, 110 );  
         
        grafiekje.paint( g );        
            
        grafiekje2.paint( g );      
    }

    //klasse om het afsluitenkruisje werkzaam te maken
    private class VensterHandler extends WindowAdapter {
        public void windowClosing( WindowEvent e ) {                    
            dispose(); 
            System.exit( 0 );
        }
    }

    private class KnopHandler implements ActionListener{
        public void actionPerformed( ActionEvent e ) {
            if( start.getLabel().equals( "start" ) ){
                analyse = true;
                start.setLabel( "stop" );                
                analyse = true;
                repaint();                            
            }
            else{
                analyse = false;
                start.setLabel( "start" );               
                analyse = false;
                repaint();
            }
        }
    }

    public void update(Graphics g){
        if(analyse){
            //random grafiekjes maken
            grafiekje.addWaarde((int)(10 * Math.random() * ( 10 * Math.random())));
            grafiekje2.addWaarde((int)(10 * Math.random() * ( 10 * Math.random())));
            //voorkomen dat het iets te snel gaat
            try { Thread.sleep( 50 );}
            catch( InterruptedException e ){}
            repaint();
        }       
        paint(g);
    }

    
}

En dit is de klasse die de grafiek genereert:
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
import java.awt.*;
import java.util.*;

public class Grafiek extends Panel {
    private int x, y, breedte, hoogte, max;
    private Vector waarden;
    
    public Grafiek(int x, int y, int breedte, int hoogte, int max) {
        this.x = x;
        this.y = y;
        this.breedte = breedte;
        this.hoogte = hoogte;
        this.max = max; 
    
        waarden = new Vector();
        
        for( int i = 0; i < max; i++ ){
            waarden.addElement( new Integer(0) );
        }   
    }
    
    public void update(Graphics g){
        paint( g );
    }
    
    public void paint(Graphics g) {
        g.setColor(Color.red);
        
        for( int i = 0; i < waarden.size(); i++ ){
            g.drawLine(i + x, y + hoogte - Integer.parseInt(waarden.elementAt(i).toString()),
 i + x, y + hoogte-Integer.parseInt(waarden.elementAt(i+1).toString()));
        }
    }
    
    public void addWaarde( int waarde ) {
        waarden.removeElementAt(0);
        waarden.addElement(new Integer( waarde ) );
        repaint();
    }
    
    public void setMax( int waarde )
    {
        this.max = waarde;      
    }
}


Sorrie als het een beetje veel code is, maar ik snap niet waarom ik niet twee grafieken kan tekenen en ik zit nogal tegen de deadline.

Als ik het programma nu run, zie ik alleen de bovenste grafiek. Als ik in het programma in de paint de eerste grafiek weghaal, zie ik wel de tweede grafiek, maar dus niet meer de eerste (die heb ik immers uit de paint weg gehaald). Ik wil ze echter allebei zien, maar dat laatste schijnt absoluut niet te kunnen.

Weet iemand waarom, en nog beter, wat ik daar aan kan doen?

edit:
oja, ik werk hier met de java 1.1.8. I.v.m. school moet ik daar genoegen mee nemen. Net zoals ik genoegen moet nemen met dat ik geen swing kan gebruiken (voor hier niet echt boeiend maargoed), maar vandaar dus die Integer ParseInt constructie :)

[ Voor 7% gewijzigd door Verwijderd op 23-06-2003 18:58 ]


  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 29-06 12:23

koli-man

Bartender!!!!

ik zie eigenlijk niets geks, alleen dat je 2 functies paint met dezelfde parameters hebt. Als het goed is mag dat niets uitmaken, maar misschien dat de compiler er even een probleempje mee zou hebben?

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


Verwijderd

Topicstarter
koli-man schreef op 23 June 2003 @ 22:58:
ik zie eigenlijk niets geks, alleen dat je 2 functies paint met dezelfde parameters hebt. Als het goed is mag dat niets uitmaken, maar misschien dat de compiler er even een probleempje mee zou hebben?
Nee, hij runt wel, maar hij wil maar één grafiek tegelijk uit tekenen.
Pas als ik de eerste grafiek niet in de paint zet, kan ik die tweede zien. Ik heb geprobeerd in de klasse grafiek boundaries mee te geven aan zichzelf, omdat misschien zijn tweede instantie overdekt ofzo, maar dat hielp niet.

Hij geeft iig geen foutmeldingen, maar hij laat maar één grafiek zien. Niet twee tegelijk.

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 29-06 12:23

koli-man

Bartender!!!!

ja, maar
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void paint( Graphics g ){  
        //ruimte voor grafiek 
        g.setColor( Color.white ); 
        g.fillRect( 95, 90, 220, 110 );           
         
           //ruimte voor grafiek2 
        g.setColor( Color.white ); 
        g.fillRect( 95, 260, 220, 110 );   
          
        grafiekje.paint( g );         
             
        grafiekje2.paint( g );       
    }


hier heb je dezelfde g. ik denk dat hij er wel 2 tekent, maar 2 dezelfde over elkaar.

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


Verwijderd

Topicstarter
Ik snap wat je bedoeld. Ik weet alleen niet hoe ik het moet oplossen. Ik heb het zo werkend gezien, alleen met meer code in Grafiek en ik weet niet welke code. Kun je Grafiek zijn grootte beperken door zichzelf boundaries te geven waar hij niet buiten mag?

Verwijderd

Topicstarter
lamaar

edit:
ik ben nu twee copiën van het grafische vlak aan het maken, die maar een bepaald deel van g mee krijgen. Ik laat wel weten of het heeft gewerkt

[ Voor 195% gewijzigd door Verwijderd op 24-06-2003 10:36 ]


Verwijderd

Topicstarter
Nu heb ik in plaats van één g, er twee gemaakt, door g voor een deel te copiëren.
Zie hier:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void paint( Graphics g ){ 
        Graphics y = g.create( 95, 90, 220, 110 );
        Graphics z = g.create( 95, 260, 315, 500 );
        
        //ruimte voor grafiek
        y.setColor( Color.white );
        y.fillRect( 0, 0, 220, 110 );      
        
        //ruimte voor grafiek2
        z.setColor( Color.white );
        z.fillRect( 0, 0, 220, 100 );     

         
        grafiekje.paint( y );        
            
        winAmpje.paint( z );      
    }


in de constructor van testklasse staat dus nu onder andere dit:
Java:
1
2
grafiekje = new Grafiek( 0, 0, 220, 100, 220 );
winAmpje = new Grafiek( 0,-20, 220, 110, 220 );

Check de -20 8)

Nu heb ik eigenlijk nog steeds hetzelfde probleem. Ik kan de eerste grafiek laten tekenen, ik kan de tweede grafiek laten tekenen, maar als ik nu zoals boven allebij de grafieken wil zien, dan zie ik er wederom maar eentje :'(

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom roep je eigenlijk de paint methodes aan? Je hebt je grafiek een subclass gemaakt van panel. Je kunt dan veel beter je panels gewoon adden ( Zorg dat je wel een goede LayoutManager hebt ) aan je frame. Daarna wordt de update methode van je Panel automatisch aangeroepen als er gerepaint moet worden. Als je het niet zo doet is het compleet overbodig dat je van panel extend.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op 24 June 2003 @ 11:26:
Waarom roep je eigenlijk de paint methodes aan? Je hebt je grafiek een subclass gemaakt van panel. Je kunt dan veel beter je panels gewoon adden ( Zorg dat je wel een goede LayoutManager hebt ) aan je frame. Daarna wordt de update methode van je Panel automatisch aangeroepen als er gerepaint moet worden. Als je het niet zo doet is het compleet overbodig dat je van panel extend.
Thnx, dat werkt inderdaad. Vandaar dat het een extends Panel was :)

De paint() uit TestKlasse is weg, en in Grafiek ziet ie er nu zo uit.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    
    public void paint(Graphics g) {           
        g.setColor( Color.white );
        g.fillRect( 0,0, 220, 110 );
        
        g.setColor( Color.lightGray ); 
        for( int i = 0; i < 110; i += 10 ){        
            g.drawLine( 0, i, 220, i );           
        }     
        
        for( int i = 0; i < 220; i += 10 ){        
            g.drawLine( i, 110, i, 0 );            
        }  
        
        g.setColor(Color.red);
        
        
        for( int i = 0; i < waarden.size(); i++ ){
            g.drawLine(i, -10 + hoogte - Integer.parseInt(waarden.elementAt(i).toString()),
 i , -10 + hoogte-Integer.parseInt(waarden.elementAt(i+1).toString()));
        }        
    }
    


En het werkt :)

[ Voor 27% gewijzigd door Verwijderd op 24-06-2003 13:15 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Even offtopic:
Java:
1
Integer.parseInt(waarden.elementAt(i).toString())


wat is dat :?
Beetje omslachtig, denk je ook niet. Je hebt een vector waar integerwaardes in staan, die converteer je eerst naar een String, en daarna weer naar een integer. Is het niet handig als je het element gewoon cast naar Integer en dan de waarde opvraagt met intValue ()? Zomaar een ideetje hoor ;)

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.


Verwijderd

Topicstarter
.oisyn schreef op 24 June 2003 @ 13:46:
Even offtopic:
Java:
1
Integer.parseInt(waarden.elementAt(i).toString())


wat is dat :?
Beetje omslachtig, denk je ook niet. Je hebt een vector waar integerwaardes in staan, die converteer je eerst naar een String, en daarna weer naar een integer. Is het niet handig als je het element gewoon cast naar Integer en dan de waarde opvraagt met intValue ()? Zomaar een ideetje hoor ;)
Ja, klopt, maar dat regeltje heb ik ook niet geschreven :P. Iemand anders hier :).

edit:
Trouwens, of er nu
[code=java]Integer.parseInt(waarden.elementAt(i).toString())[/code]
of
[code=java]((Integer)waarden.elementAt(i)).intValue()[/code]
staat.

Zo gek veel tikken scheelt het ook niet :).

[ Voor 19% gewijzigd door Verwijderd op 24-06-2003 21:10 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op 24 June 2003 @ 14:17:
[...]

Ja, klopt, maar dat regeltje heb ik ook niet geschreven :P. Iemand anders hier :).

edit:
Trouwens, of er nu
[code=java]Integer.parseInt(waarden.elementAt(i).toString())[/code]
of
[code=java]((Integer)waarden.elementAt(i)).intValue()[/code]
staat.

Zo gek veel tikken scheelt het ook niet :).
Voor het tikken haalt het inderdaad niet zoveel uit. Maar de werking is natuurlijk wel compleet anders!

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Idd. En voor integers is de werking ook wel correct, maar zodra je bijvoorbeeld met floats gaat werken krijg je afrondingsfouten. Lijkt me toch niet echt handig

En buiten dat is het zo inefficient als het maar zijn kan

offtopic:
trouwens, rwb, check het aarsforum :)

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.


Verwijderd

Topicstarter
Nou vooruit dan, in de nieuwe staafdiagramklasse zit nu wel
Java:
1
((Integer)waarden.elementAt(i)).intValue()
;)
Pagina: 1