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
:
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:
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.
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.