[JAVA] Double buffering bij een panel... hoe?

Pagina: 1
Acties:

  • Wouter
  • Registratie: September 2000
  • Niet online
Hoi,

ik heb een probleempje met een applet waar ik mee bezig ben. Ik heb bij deze applet, omdat ik grafische knoppen wou, een nieuwe klasse imageButton gemaakt die Panel extend.

Deze klasse heeft een eigen methode paint voor het neerzetten van de afbeelding en tekst op de panel. Eigenlijk is het niet echt een knop dus, maar goed; het probleem is dat hij knippert zodra je erop klikt.

Als je erop klikt wordt er namelijk een nieuwe afbeelding op neergezet gevolgd door een repaint();

Ben er inmiddels achter dat je dit zou moeten oplossen door gebruik te maken van double buffering. Hiervoor ben ik een paar topics afgegaan hier en heb talloze voorbeelden op internet geprobeerd, maar het is allemaal niet gelukt om te gebruiken in de imageButton klasse (het lukte overigens wel met de GUI klasse, maar daar had ik ook nog een paar probleempjes mee, kom ik zo op terug).


Hieronder de code van de klasse 'imageButton', ik hoop dat jullie me kunnen vertellen hoe ik hier gebruik maak van double buffering :{ :
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
import java.awt.*;


public class imageButton extends Panel
{

     Image image, ingedrukt, los;
     String tekst;
     int tekstX, tekstY, breedte, hoogte, inX, inY;



     public imageButton(int x, int y, int breedte, int hoogte, Image los, Image ingedrukt, String tekst)
     {  

        this.los = los.getScaledInstance(breedte,hoogte,100);
        this.ingedrukt = ingedrukt.getScaledInstance(breedte,hoogte,100);
        this.breedte = breedte;
        this.hoogte = hoogte;

        this.image = los;       

        this.tekst = tekst;
        super.setBounds(x,y,breedte,hoogte);
        super.setLayout(null);

        tekstY = (hoogte/2)+4;
        tekstX = (int)((breedte/2)-(3.2*tekst.length()));

        inX = (hoogte/2)+4;
        inY = (int)((breedte/2)-(3.2*tekst.length()));   

     }  

     public void ingedrukt()
     {    
        image = ingedrukt;
        tekstY = tekstY - 1;
        tekstX = tekstX + 1;

        repaint();              
     }

     public void los()
     {   
        image = los;
        tekstY = inX;
        tekstX = inY;

        repaint();          
     } 

     public void paint(Graphics g)
     {    
         this.getGraphics().drawImage(image,0,0,this);       
         g.drawString(tekst,tekstX,tekstY);

     }    

}

Vervolgens de code van de GUI klasse; hierbij is double buffering me ook niet echt gelukt, omdat ik niet wist hoe ik iets als 'mainMenu.getGraphics().drawImage(BG2,0,0,this);' moest double bufferen... normaal zou het dan iets worden als 'graphicsBuffer.drawImage...' maar dan zet ie hem niet op panel mainMenu neer.

Ik zal even de code van de GUI klasse geven:
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
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import java.awt.Image.*;


public class GUI extends Applet implements ActionListener, MouseListener
{
    
    Panel login, mainMenu, opties;
    
    TextField user, pass;
    TextField codeveld;
    
    Button inrijden, uitrijden;
    
    Label checkResult, status;
    
    Image loginImage, BG, BG2, knop1, knop1_pushed, knop2, knop2_pushed, popup, popupx;    
    
    imageButton passcheck, verder, xbutton;
    
    Slagboom slagboom = new Slagboom(5,5,5);
   
   
    public void init()
    {   
       
      this.setLayout(null);
      this.setBackground(new Color(200,200,200));
      
      login = new Panel();    
      login.setLayout(null);
      login.setBounds(136,117,240,149);      
      this.add(login);
      
      mainMenu = new Panel();
      mainMenu.setLayout(null);
      mainMenu.setBounds(0,0,512,384);
      mainMenu.setVisible(false);
      mainMenu.addMouseListener(this);
      this.add(mainMenu);
      
      opties = new Panel();
      opties.setLayout(null);
      opties.setBounds(0,0,129,113);
      opties.setVisible(false);
      mainMenu.add(opties);
      
      codeveld = new TextField("code");
      codeveld.setBackground(new Color(0,0,0));
      codeveld.setForeground(new Color(255,255,255));
      codeveld.setBounds(20,15,50,20);
      opties.add(codeveld);
      
      inrijden = new Button("In");
      inrijden.setBackground(new Color(0,0,0));
      inrijden.setForeground(new Color(255,255,255));
      inrijden.setBounds(75,15,20,20);    
      inrijden.addActionListener(this);
      opties.add(inrijden);
      
      uitrijden = new Button("Uit");
      uitrijden.setBackground(new Color(0,0,0));
      uitrijden.setForeground(new Color(255,255,255));
      uitrijden.setBounds(100,15,20,20);      
      uitrijden.addActionListener(this);
      opties.add(uitrijden);
     
      user = new TextField(10);
      user.setBounds(100,30,120,25);
      user.setBackground(new Color(78,97,114));
      login.add(user);
      
      pass = new TextField(10);
      pass.setBounds(100,60,120,25);
      pass.setBackground(new Color(78,97,114));
      pass.setEchoChar('*');      
      login.add(pass);
      
      checkResult = new Label("");    
      checkResult.setBackground(new Color(78,97,120));
      login.add(checkResult);
      
      status = new Label("Label.");
      status.setBounds(30,30,400,15);
      status.setBackground(new Color(78,97,120));
      mainMenu.add(status);
      
       
      knop1 = geefAfbeelding("knop1.jpg");
      knop1_pushed = geefAfbeelding("knop1_pushed.jpg");
      
      knop2 = geefAfbeelding("knop2.jpg");
      knop2_pushed = geefAfbeelding("knop2_pushed.jpg");
      
      popup = geefAfbeelding("popup.jpg"); 
      popupx = geefAfbeelding("popupx.jpg"); 
      loginImage = geefAfbeelding("login.jpg");  
      
      BG = geefAfbeelding("loginbg.jpg");
      BG2 = geefAfbeelding("bg2.jpg");
      
 
      
      passcheck = new imageButton(100,90,118,27, knop1, knop1_pushed, "Invoeren");    
      login.add(passcheck);   
      passcheck.addMouseListener(this);
      
      verder = new imageButton(100,90,110,23, knop2, knop2_pushed, "verder");    
      mainMenu.add(verder);
      verder.addMouseListener(this); 
      
      xbutton = new imageButton(122,0,8,9, popupx, popupx, "");  
      opties.add(xbutton);
      xbutton.addMouseListener(this);
      
      repaint();
      
    }   
    
    
    public void paint(Graphics g)
    {  
      this.getGraphics().drawImage(BG,0,0,this);     
      mainMenu.getGraphics().drawImage(BG2,0,0,this);     
      login.getGraphics().drawImage(loginImage,0,0,this);
      opties.getGraphics().drawImage(popup,0,0,this);    
    }
    
    
    public void actionPerformed(ActionEvent event)
    {
      if (event.getSource() == inrijden)
      {
        status.setText(slagboom.inrijden(codeveld.getText()));
      } 
    }
    
    
    public void mousePressed(MouseEvent e)
    {    
      if (e.getComponent() == passcheck){passcheck.ingedrukt();}
      if (e.getComponent() == verder){verder.ingedrukt();}
      if (e.getComponent() == xbutton){opties.setVisible(false);}
      
      repaint();
      
    }
    
    public void mouseReleased(MouseEvent e)
    {     
            
      
    }
    
    public void mouseClicked(MouseEvent e)
    {    
      
      if (e.getComponent() == passcheck){this.passCheck(); passcheck.los();}  
      if (e.getComponent() == verder){verder.los();}
      
      if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0 && e.getComponent() == mainMenu){       
        
        opties.setBounds(e.getX(),e.getY(),129,113);        
        opties.setVisible(true);
        
        
      }  
      
      repaint();
    
    }    
    
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e)
    {
      
     if (e.getComponent() == passcheck){passcheck.los();}
     if (e.getComponent() == verder){verder.los();} 
    
    }
    
    

    public Image geefAfbeelding(String bestandsnaam)
    {
      
        Image ImageToBeLoaded = getImage(getDocumentBase(), bestandsnaam);
        MediaTracker tracker1 = new MediaTracker(this);
        tracker1.addImage(ImageToBeLoaded, 0);
        
        try {tracker1.waitForID(0);}
        catch (InterruptedException e) {}
      
        return ImageToBeLoaded;
        
    }
    
    
    public void passCheck()
    {
      
      String[] usernames = {"wouter"};
      String[] passwords = {"1"};     
      
      String currentUser = user.getText();
      String currentPass = pass.getText();
      
      for (int count = 0; count < usernames.length; count++)
      {
        
        
        if (usernames[count].equals(currentUser))
        {
            
            if (passwords[count].equals(currentPass))
            {
              checkResult.setBounds(100,120,120,15);
              checkResult.setText("Wachtwoord correct!");
              
              
              try {Thread.sleep(1000);} catch (InterruptedException e) {System.err.println("sleep exeption");}
              
              login.setVisible(false);
              mainMenu.setVisible(true);
              
             
            }
            else
            {   
              checkResult.setBounds(100,120,120,15);
              checkResult.setText("Wachtwoord incorrect!");
            }   
            
            count = usernames.length;
              
        }
        else
        {
        checkResult.setText("Gebruiker bestaat niet.");
        }
        
      }
      
      checkResult.setBounds(100,120,120,15);
      
    }
    
}

Nog een probleem wat ik had met de uitvoer van de applet is dat de panel 'opties' vaak een grijs vlak achterlaat in plaats van te verdwijnen, of meteen een grijs vlak geeft bij het verschijnen. Dit laatste heeft trouwens de panel 'login' ook, die is soms gewoon grijs bij het runnen van de applet.

Ook ververst de applet niet als de appletviewer op de achtergrond is geweest en weer naar voren wordt gehaald, de hele applet is dan grijs.

Tenslotte; de applet is te bekijken op: http://www.xs4all.nl/~wognum/java
user: wouter , pass: 1
rechts klikken na inloggen voor panel 'opties'


Mischien dat het dan wat duidelijker wordt :{

Ik hoop dat iemand me hiermee kan helpen.
Alvast bedankt.

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

in het kort gaat het zo:
code:
1
2
3
4
5
6
public void update(Graphics g) {
  Image buffer = new Image( (size etc... opgeven) );
  Graphics g2 = buffer.getGraphics();
  paint(g2);
  g.drawImage(buffer);
}

en dan aanroepen met refresh();

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 08:29 schreef Scorpion het volgende:
in het kort gaat het zo:
code:
1
2
3
4
5
6
public void update(Graphics g) {
  Image buffer = new Image( (size etc... opgeven) );
  Graphics g2 = buffer.getGraphics();
  paint(g2);
  g.drawImage(buffer);
}

en dan aanroepen met refresh();
Dan krijg ik de error:

cannot create an instance of an abstract type.
type is 'class java.awt.Image'.

Bij 'buffer = new Image(breedte, hoogte);'

En hoef ik voor de rest NIKS aan de paint methode te veranderen?

  • Wouter
  • Registratie: September 2000
  • Niet online
oops.... quote ipv edit
tis nog vroeg :X

Verwijderd

mm.... ook student op de AIM zo te zien... *D

Verwijderd

probeer eens:
code:
1
2
if (buffer == null) 
    buffer = createImage(breedte, hoogte);

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

JButton kan ook plaatjes weergeven ;)

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 10:07 schreef Chief_BoZ het volgende:
mm.... ook student op de AIM zo te zien... *D
yep
Op maandag 04 maart 2002 10:47 schreef JavaRules het volgende:
probeer eens:
code:
1
2
if (buffer == null) 
    buffer = createImage(breedte, hoogte);
k, nu krijg ik die vorige melding niet meer

maar nu krijg ik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
number of arguments do not match those in prototype(s).
 argument types: 'drawImage(java.awt.Image)'.
 rejected candidate: 'boolean java.awt.Graphics.drawImage(java.awt.Image,int,int,java.awt.image.ImageObserver)'.
 symbol defined in: java/awt/Graphics.class.
 rejected candidate: 'boolean java.awt.Graphics.drawImage(java.awt.Image,int,int,int,int,java.awt.image.ImageObserver)'.
 symbol defined in: java/awt/Graphics.class.
 rejected candidate: 'boolean java.awt.Graphics.drawImage(java.awt.Image,int,int,java.awt.Color,java.awt.image.ImageObserver)'.
 symbol defined in: java/awt/Graphics.class.
 rejected candidate: 'boolean java.awt.Graphics.drawImage(java.awt.Image,int,int,int,int,java.awt.Color,java.awt.image.ImageObserver)'.
 symbol defined in: java/awt/Graphics.class.
 rejected candidate: 'boolean java.awt.Graphics.drawImage(java.awt.Image,int,int,int,int,int,int,int,int,java.awt.image.ImageObserver)'.
 symbol defined in: java/awt/Graphics.class.
 rejected candidate: 'boolean java.awt.Graphics.drawImage(java.awt.Image,int,int,int,int,int,int,int,int,java.awt.Color,java.awt.image.ImageObserver)'.
 symbol defined in: java/awt/Graphics.class.
        g.drawImage(buffer);
Op maandag 04 maart 2002 10:52 schreef wasigh het volgende:
JButton kan ook plaatjes weergeven ;)
en dat zit bij JDK 1.1?

  • Wouter
  • Registratie: September 2000
  • Niet online
Ik heb er

g.drawImage(buffer,0,0,breedte,hoogte,this);

van gemaakt.

Nu runt ie de applet wel,
maar double buffering werkt niet echt...

Als ik nu op een knop druk wordt deze gewoon grijs.

Verwijderd

int x=10,y=10;
g.drawImage(buffer,x,y,null);

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 11:03 schreef JavaRules het volgende:
int x=10,y=10;
g.drawImage(buffer,x,y,null);
Dan doet ie nog steeds hetzelfde.

Knop wordt grijs zodra je erop klikt en het lijkt wel alsof ie het nieuwe plaatje over het oude heentekent, want de tekst verspringt wel 1 pixel, maar de oude blijft staan.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Nee JButton zit niet bij JDK 1.1, maar we zijn ondertussen bij 1.4 aanbeland. Mensen mogen wel eens een nieuwe JVM installen..

De swing classes kun je in een jar zetten en meesturen. 2e voordeel van swing is dat elk component een methode heeft: setDoubleBuffered(boolean)

En dan wordt alles doublebufferd! ;)

AWT is achterhaald ga met je tijd mee...

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 11:16 schreef wasigh het volgende:
Nee JButton zit niet bij JDK 1.1, maar we zijn ondertussen bij 1.4 aanbeland. Mensen mogen wel eens een nieuwe JVM installen..

De swing classes kun je in een jar zetten en meesturen. 2e voordeel van swing is dat elk component een methode heeft: setDoubleBuffered(boolean)

En dan wordt alles doublebufferd! ;)

AWT is achterhaald ga met je tijd mee...
vertel dat aan onze school

Ik wil weten hoe het met JDK 1.1 moet.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 04 maart 2002 11:20 schreef . w o u t e r . het volgende:

[..]

vertel dat aan onze school

Ik wil weten hoe het met JDK 1.1 moet.
:( welke school? en waarom vertel je het niet zelf?

met jdk 1.1 kun je nog steeds de swing files aan je applet meegeven ;)

maar ok: dubbelBufferen :)

het principe is vrij simpel:
-> we nemen 2 graphics objects
-> de 1e displayen we, de andere gaan we op tekenen.
-> dan switchen de graphics objects van plaats :)

voor het verkrijgen van een Graphics object:
http://java.sun.com/products/jdk/1.1/docs/api/java.awt.Graphics.html#_top_
en dan de method create()....

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 11:27 schreef wasigh het volgende:

[..]

:( welke school? en waarom vertel je het niet zelf?

met jdk 1.1 kun je nog steeds de swing files aan je applet meegeven ;)

maar ok: dubbelBufferen :)

het principe is vrij simpel:
-> we nemen 2 graphics objects
-> de 1e displayen we, de andere gaan we op tekenen.
-> dan switchen de graphics objects van plaats :)

voor het verkrijgen van een Graphics object:
http://java.sun.com/products/jdk/1.1/docs/api/java.awt.Graphics.html#_top_
en dan de method create()....
ja, dat probeer ik dus al de hele tijd te doen, maar het lukt niet, als je ff de rest van de topic leest

  • Wouter
  • Registratie: September 2000
  • Niet online
ok, ik heb nu
code:
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)
     {   
         if (buffer == null)
            buffer = createImage(breedte, hoogte);       
         
         if (g2 == null)
            g2 = buffer.getGraphics();       
         
         g2.drawImage(image,0,0,this);
         g2.drawString(tekst,tekstX,tekstY);             

     }    
     
     public void update(Graphics g)
     {
         
        g2.clearRect(0,0,breedte,hoogte);
        
        paint(g2);
        
        g.drawImage(buffer,0,0,this);
        
     }

dat werkt gedeeltelijk

hij knippert niet meer als je erop klikt

maar hij is de 1e keer dat ie verschijnt NIET zichtbaar (grijs vlak), pas als je erop klikt wordt ie zichtbaar :{

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 04 maart 2002 11:36 schreef . w o u t e r . het volgende:
ok, ik heb nu
code:
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)
     {   
         if (buffer == null)
            buffer = createImage(breedte, hoogte);       
         
         if (g2 == null)
            g2 = buffer.getGraphics();       
         
         g2.drawImage(image,0,0,this);
         g2.drawString(tekst,tekstX,tekstY);             

     }    
     
     public void update(Graphics g)
     {
         
        g2.clearRect(0,0,breedte,hoogte);
        
        paint(g2);
        
        g.drawImage(buffer,0,0,this);
        
     }

dat werkt gedeeltelijk

hij knippert niet meer als je erop klikt

maar hij is de 1e keer dat ie verschijnt NIET zichtbaar (grijs vlak), pas als je erop klikt wordt ie zichtbaar :{
roep aan het einde van je init eens repaint() aan?

Verwijderd

Oh in 1.1 zit wel degelijk swing:
kijk is onder com.sun.javax.swing.*;
Dus dat kan wel. Maar is uiteraard niet nodig, AWT voldoet gewoon prima.

Wat dubbele buffering betreft, ja das even wat lastiger. Ten eerste ben ik het niet eens met de voorstellen om het tekenen in "update()" te verzorgen. Leeg daarin liever je buffer om die vervolgens in "paint()" weer te vullen. Zo hou je namelijk veel beter overzicht en duidelijke code.

Ten tweede de grafische context: Zoals menig Java boek je zal vertellen maak je je dubbele buffer in de "init()" aan. Helaas werkt dit niet. Want de grafische context is in init() nog gewoon null. Je zult deze dus eenmalig in paint() moeten aanmaken.

Uiteraard is er een andere weg naar Rome, door gebruik te maken van Graphics2d, en dan is het opeens wel mogelijk om in de init de buffer aan te maken, en dat alles met een simpele regel code:
Image buffer = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(size().width, size().height());

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 11:39 schreef wasigh het volgende:

[..]

roep aan het einde van je init eens repaint() aan?
Klasse imageButton HEEFT geen init.

Als ik er een init in zou dan voert ie die niet eens uit.

repaint(); in de init van de GUI klasse heeft geen effect...

Stomme applet blijft nog steeds 9 van de 10 keer gewoon een grijs vlak geven voor al die panels.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op maandag 04 maart 2002 11:44 schreef . w o u t e r . het volgende:

[..]

Klasse imageButton HEEFT geen init.

Als ik er een init in zou dan voert ie die niet eens uit.

repaint(); in de init van de GUI klasse heeft geen effect...

Stomme applet blijft nog steeds 9 van de 10 keer gewoon een grijs vlak geven voor al die panels.
Je applet heeft toch een init? anders maak je die toch?
doe daar een repaint() of een setVisible(true) op al je panels....

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 11:42 schreef markvleth het volgende:
Oh in 1.1 zit wel degelijk swing:
kijk is onder com.sun.javax.swing.*;
Dus dat kan wel. Maar is uiteraard niet nodig, AWT voldoet gewoon prima.

Wat dubbele buffering betreft, ja das even wat lastiger. Ten eerste ben ik het niet eens met de voorstellen om het tekenen in "update()" te verzorgen. Leeg daarin liever je buffer om die vervolgens in "paint()" weer te vullen. Zo hou je namelijk veel beter overzicht en duidelijke code.

Ten tweede de grafische context: Zoals menig Java boek je zal vertellen maak je je dubbele buffer in de "init()" aan. Helaas werkt dit niet. Want de grafische context is in init() nog gewoon null. Je zult deze dus eenmalig in paint() moeten aanmaken.

Uiteraard is er een andere weg naar Rome, door gebruik te maken van Graphics2d, en dan is het opeens wel mogelijk om in de init de buffer aan te maken, en dat alles met een simpele regel code:
Image buffer = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(size().width, size().height());
Hoe moet ik de code dan aanpassen zodat het werkt?
exact graag

Ik heb namelijk al allerlei manieren geprobeerd die ik op internet tegenkwam, maar het werkt steeds niet! :(

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 11:47 schreef wasigh het volgende:

[..]

Je applet heeft toch een init? anders maak je die toch?
doe daar een repaint() of een setVisible(true) op al je panels....
Een repaint op al m'n panels?

ik kan toch niet doen: repaint(panelnaam); ofzo?

En niet alle panels moeten tegelijk zichtbaar zijn.

De code staat bovenin. Daar kan je zien hoe m'n applet in elkaar zit.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Okay, ik heb je code nog eens bekeken, en hij zit erg vaag in elkaar.

1> Bij Conventie beginnen class namen in Java met een hoofdletter
2> nergens public of private bij je variabelen
3> je voegt je panels niet toe aan je applet, maar je laat je panels zichzelf tekenen op het graphics object.

Dit gaat zo'n beetje tegen alle regels van OO ontwerp in.


Add je panels aan je Applet:
this.add(panelNaam); // in je applet

Zoek uit hoe je met layout's kunt werken, null layout met setBounds() op je panels is denk ik het beste voor jou.

En zoek eens iets op over MVC

(damn, wat mis ik martin...)

  • Wouter
  • Registratie: September 2000
  • Niet online
Op maandag 04 maart 2002 12:02 schreef wasigh het volgende:
Okay, ik heb je code nog eens bekeken, en hij zit erg vaag in elkaar.

1> Bij Conventie beginnen class namen in Java met een hoofdletter
2> nergens public of private bij je variabelen
3> je voegt je panels niet toe aan je applet, maar je laat je panels zichzelf tekenen op het graphics object.

Dit gaat zo'n beetje tegen alle regels van OO ontwerp in.


Add je panels aan je Applet:
this.add(panelNaam); // in je applet

Zoek uit hoe je met layout's kunt werken, null layout met setBounds() op je panels is denk ik het beste voor jou.

En zoek eens iets op over MVC

(damn, wat mis ik martin...)
Punt 1 heb ik ff veranderd... niet dat dat wat uitmaakte maar goed.


Punt 3 snap ik niet helemaal hoor.

Ik heb toch:

this.add(mainMenu);
this.add(login);
mainMenu.add(opties);
Zoek uit hoe je met layout's kunt werken, null layout met setBounds() op je panels is denk ik het beste voor jou.
login.setLayout(null);
mainMenu.setLayout(null);
opties.setLayout(null);

login.setBounds(136,117,240,149);
opties.setBounds(0,0,129,113);
opties.setBounds(0,0,129,113);


Staat er allemaal in.

Ik snap dus niet wat je bedoelt :?
je voegt je panels niet toe aan je applet, maar je laat je panels zichzelf tekenen op het graphics object.
Hoe bedoel je?

Met de code:
public void paint(Graphics g)
{
this.getGraphics().drawImage(BG,0,0,this);

mainMenu.getGraphics().drawImage(BG2,0,0,this);
login.getGraphics().drawImage(loginImage,0,0,this);
opties.getGraphics().drawImage(popup,0,0,this);

}
Teken ik enkel plaatjes op de panels toch?

  • Wouter
  • Registratie: September 2000
  • Niet online
hoe kan ik uberhaupt dit:
code:
1
2
3
mainMenu.getGraphics().drawImage(BG2,0,0,this); 
login.getGraphics().drawImage(loginImage,0,0,this);
opties.getGraphics().drawImage(popup,0,0,this);

naar een image buffer schrijven?

moet ik dan voor iedere panel een aparte buffer maken?


Ik kan ook nergens een voorbeeld vinden waar ze een imagebuffer gebruiken met panels :(

  • Wouter
  • Registratie: September 2000
  • Niet online
yeah, I've done it :)

Ik heb een nieuwe klasse MyPanel gemaakt met een eigen paint methode... ik weet niet of de originele Panel klasse die ook al had, maar daar werkte panelnaam.add(image); niet, dus heb ik die add methode er bij MyPanel ingezet.

Niks knippert meer en niks wordt meer grijs nu *D


Nog even de uiteindelijke code:
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
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import java.awt.Image.*;


public class GUI extends Applet implements ActionListener, MouseListener
{    
   
    private MyPanel login, opties, mainMenu;    
    private TextField user, pass, codeveld; 
    private Button inrijden, uitrijden;    
    private Label checkResult, status;    
    private Image loginImage, BG, BG2, knop1, knop1_pushed, knop2, knop2_pushed, popup, popupx;     
    private ImageButton passcheck, verder, xbutton;    
    private Slagboom slagboom = new Slagboom(5,5,5);
   
   
    public void init()
    {   
       
      this.setLayout(null);
      this.setBackground(new Color(200,200,200));
      
      login = new MyPanel();      
      login.setLayout(null);
      login.setBounds(136,117,240,149);      
      this.add(login);
      
      mainMenu = new MyPanel();
      mainMenu.setLayout(null);
      mainMenu.setBounds(0,0,512,384);
      mainMenu.setVisible(false);
      mainMenu.addMouseListener(this);
      this.add(mainMenu);
      
      opties = new MyPanel();
      opties.setLayout(null);
      opties.setBounds(0,0,129,113);
      opties.setVisible(false);
      mainMenu.add(opties);
      
      codeveld = new TextField("code");
      codeveld.setBackground(new Color(0,0,0));
      codeveld.setForeground(new Color(255,255,255));
      codeveld.setBounds(20,15,50,20);
      opties.add(codeveld);
      
      inrijden = new Button("In");
      inrijden.setBackground(new Color(0,0,0));
      inrijden.setForeground(new Color(255,255,255));
      inrijden.setBounds(75,15,20,20);    
      inrijden.addActionListener(this);
      opties.add(inrijden);
      
      uitrijden = new Button("Uit");
      uitrijden.setBackground(new Color(0,0,0));
      uitrijden.setForeground(new Color(255,255,255));
      uitrijden.setBounds(100,15,20,20);      
      uitrijden.addActionListener(this);
      opties.add(uitrijden);
     
      user = new TextField(10);
      user.setBounds(100,30,120,25);
      user.setBackground(new Color(78,97,114));
      login.add(user);
      
      pass = new TextField(10);
      pass.setBounds(100,60,120,25);
      pass.setBackground(new Color(78,97,114));
      pass.setEchoChar('*');      
      login.add(pass);
      
      checkResult = new Label("");    
      checkResult.setBackground(new Color(78,97,120));
      login.add(checkResult);
      
      status = new Label("Label.");
      status.setBounds(30,30,400,15);
      status.setBackground(new Color(78,97,120));
      mainMenu.add(status);
      
      /*--------------------------------------------------------//
        Hier worden met behulp van de methode
        geefAfbeelding de verschillende afbeeldingen geladen.
      //--------------------------------------------------------*/
      
      knop1 = geefAfbeelding("knop1.jpg");
      knop1_pushed = geefAfbeelding("knop1_pushed.jpg");
      
      knop2 = geefAfbeelding("knop2.jpg");
      knop2_pushed = geefAfbeelding("knop2_pushed.jpg");
      
      popup = geefAfbeelding("popup.jpg"); 
      popupx = geefAfbeelding("popupx.jpg"); 
      loginImage = geefAfbeelding("login.jpg");  
      
      BG = geefAfbeelding("loginbg.jpg");
      BG2 = geefAfbeelding("bg2.jpg");
      
      /*--------------------------------------------------------//
        Hier worden de verschillende knoppen met 2
        aparte afbeeldingen geladen.
      //--------------------------------------------------------*/
      
      passcheck = new ImageButton(100,90,118,27, knop1, knop1_pushed, "Invoeren");    
      login.add(passcheck);   
      passcheck.addMouseListener(this);
      
      verder = new ImageButton(100,90,110,23, knop2, knop2_pushed, "verder");    
      mainMenu.add(verder);
      verder.addMouseListener(this); 
      
      xbutton = new ImageButton(122,0,8,9, popupx, popupx, "");  
      opties.add(xbutton);
      xbutton.addMouseListener(this);
      
      /*--------------------------------------------------------//
        Hier worden afbeeldingen aan de panels gegeven.
      //--------------------------------------------------------*/
     
      login.add(loginImage);
      mainMenu.add(BG2);
      opties.add(popup);
      
      
    }   
    
    
    public void paint(Graphics g)
    {  
      this.getGraphics().drawImage(BG,0,0,this);         
    }
    
    
    public void actionPerformed(ActionEvent event)
    {
      if (event.getSource() == inrijden)
      {
        status.setText(slagboom.inrijden(codeveld.getText()));
      } 
    }
    
    
    public void mousePressed(MouseEvent e)
    {    
      if (e.getComponent() == passcheck){passcheck.ingedrukt();}
      if (e.getComponent() == verder){verder.ingedrukt();}
      if (e.getComponent() == xbutton){opties.setVisible(false);}
      
      
      
    }
    
    public void mouseReleased(MouseEvent e)
    {     
            
      
    }
    
    public void mouseClicked(MouseEvent e)
    {    
      
      if (e.getComponent() == passcheck){this.passCheck(); passcheck.los();}  
      if (e.getComponent() == verder){verder.los();}
      
      if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0 && e.getComponent() == mainMenu){       
        
        opties.setBounds(e.getX(),e.getY(),129,113);        
        opties.setVisible(true);
        
        
      }  
      
      
    
    }    
    
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e)
    {
      
     if (e.getComponent() == passcheck){passcheck.los();}
     if (e.getComponent() == verder){verder.los();} 
    
    }
    
    

    public Image geefAfbeelding(String bestandsnaam)
    {
      
        Image ImageToBeLoaded = getImage(getDocumentBase(), bestandsnaam);
        MediaTracker tracker1 = new MediaTracker(this);
        tracker1.addImage(ImageToBeLoaded, 0);
        
        try {tracker1.waitForID(0);}
        catch (InterruptedException e) {}
      
        return ImageToBeLoaded;
        
    }
    
    
    public void passCheck()
    {
      
      String[] usernames = {"wouter"};
      String[] passwords = {"1"};     
      
      String currentUser = user.getText();
      String currentPass = pass.getText();
      
      for (int count = 0; count < usernames.length; count++)
      {
        
        
        if (usernames[count].equals(currentUser))
        {
            
            if (passwords[count].equals(currentPass))
            {
              checkResult.setBounds(100,120,120,15);
              checkResult.setText("Wachtwoord correct!");
              
              
              try {Thread.sleep(1000);} catch (InterruptedException e) {System.err.println("sleep exeption");}
              
              login.setVisible(false);
              mainMenu.setVisible(true);
              
             
            }
            else
            {   
              checkResult.setBounds(100,120,120,15);
              checkResult.setText("Wachtwoord incorrect!");
            }   
            
            count = usernames.length;
              
        }
        else
        {
        checkResult.setText("Gebruiker bestaat niet.");
        }
        
      }
      
      checkResult.setBounds(100,120,120,15);
      
    }
    
}


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
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.Image.*;


public class ImageButton extends Panel
{

     Image image, ingedrukt, los;
     String tekst;
     int tekstX, tekstY, breedte, hoogte, inX, inY;
     
     Image offscreen;


     public ImageButton(int x, int y, int breedte, int hoogte, Image los, Image ingedrukt, String tekst)
     {  

        this.los = los.getScaledInstance(breedte,hoogte,100);
        this.ingedrukt = ingedrukt.getScaledInstance(breedte,hoogte,100);
        this.breedte = breedte;
        this.hoogte = hoogte;

        this.image = los;       

        this.tekst = tekst;
        super.setBounds(x,y,breedte,hoogte);
        super.setLayout(null);

        tekstY = (hoogte/2)+4;
        tekstX = (int)((breedte/2)-(3.2*tekst.length()));

        inX = (hoogte/2)+4;
        inY = (int)((breedte/2)-(3.2*tekst.length()));   

     }
     
     
     public void invalidate()
     {
          super.invalidate();
          offscreen = null;
     }


     public void ingedrukt()
     {    
        image = ingedrukt;
        tekstY = tekstY - 1;
        tekstX = tekstX + 1;

        repaint();              
     }

     public void los()
     {   
        image = los;
        tekstY = inX;
        tekstX = inY;

        repaint();          
     } 

     public void paint(Graphics g)
     {
         
        if(offscreen == null)
        {
            offscreen = createImage(getSize().width, getSize().height);
        }
        
        Graphics og = offscreen.getGraphics();
        og.setClip(0,0,getSize().width, getSize().height);
        
        og.drawImage(image,0,0,this);        
        og.drawString(tekst,tekstX,tekstY);
        
        super.paint(og);
        g.drawImage(offscreen, 0, 0, null);
        og.dispose();       

     }
     
     public void update(Graphics g)
     {
         paint(g);
     }


     



}


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
import java.awt.*;


public class MyPanel extends Panel
{

  Image offscreen, background;
  
    public MyPanel(){}
    
    public void add(Image image)
    {
      background = image;   
    }
    
    public void invalidate() 
    {
        super.invalidate();
        offscreen = null;
    }


    public void update(Graphics g)
    {
        paint(g);
    }


    public void paint(Graphics g)
    {
        if(offscreen == null)
        {
         offscreen = createImage(getSize().width, getSize().height);
        }
        
        Graphics og = offscreen.getGraphics();
        og.setClip(0,0,getSize().width, getSize().height);
        
        og.drawImage(background,0,0,this); 
        
        super.paint(og);
        g.drawImage(offscreen, 0, 0, null);
        og.dispose();
    }



}
Pagina: 1