Subversion Repositories wimsdev

Rev

Rev 4033 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3653 schaersvoo 1
/*
2
Copyright 2004-2006 David P. Little
3
license:
4
Unless otherwise stated, the above applets were written by David Little.
5
They may be used without permission from the author for home and/or educational (non-profit) purposes only.
6
Any other use must be approved by the author.
7
 
8
Modified for wims interactive usage with permission of the author.
9
 
10
J.M. Evers
11
*/
12
import java.awt.*;  
13
import java.awt.event.*;
14
import java.applet.*;
15
import java.util.*;
16
import javax.swing.*;
17
import javax.swing.event.*;
18
import javax.swing.border.*;
19
 
20
 
21
public class Plinko extends JApplet implements Runnable, ActionListener, ChangeListener, WindowListener{
22
    static JSpinner bins;
23
    static JSpinner rate;
24
    static JSpinner prob;
25
    JLabel count;
26
    JLabel mean;
27
    JLabel variance;
28
    JLabel current_bin;
29
    JLabel current_bin_count;
30
    JLabel current_bin_prob;
31
    JLabel confidence;
32
    JButton start;
33
    JButton clear;
34
    JButton close;
35
    PlinkoBoard plinkoboard;
36
    Thread thread;
37
    boolean active = false;
38
    int countdown = 0;
39
    JFrame frame;
40
    SplashPanel splash;
41
    static AudioClip click;
42
    static AudioClip ping;
43
// jm.evers: declaring a few things
44
    boolean wims_exercise = false;
45
    int bins_num=11;
46
    int speed=1;
47
    int total_balls=100000;
48
    double chance=0.5;
49
    int frame_x=600;
50
    int frame_y=600;
51
    int font_size=14;
52
    String title="Binomial Distribution";
53
    String click_text="CLICK ANYWHERE TO BEGIN";
54
    String start_text="START";
55
    String stop_text="STOP";
56
    String clear_text="CLEAR";
57
    String close_text="CLOSE";
58
    String label_count="Count: ";
59
    String label_mean="Mean: ";
60
    String label_variance="Variance: ";
61
    String label_bin="Bin: ";
62
    String label_bins="Bins: ";
63
    String label_speed="Speed: ";
64
    String label_probability="Probability: ";    
65
    String label_bin_count="Bin Count: ";
66
    String label_bin_probability="Bin Probability: ";
67
    String label_confidence="Confidence Interval: ";
68
    String some_text=" % of the balls landed in bin ";
69
    String through=" through ";
70
    String label_controls=" Controls ";
71
    String label_statistics="Statistics";
72
 
73
    public void init(){
74
        // jm.evers: introducing a few Applet params , used for tailoring the exercise.
75
        String s=getParameter("wims_exercise");
76
        if(s!=null){
77
            if(s.equalsIgnoreCase("yes") || s.equals("1")){
78
                wims_exercise = true;
79
                s=getParameter("balls");
80
                if(s!=null && s.length()>0){total_balls = Integer.parseInt(s, 10);}
81
                s=getParameter("chance");
82
                if(s!=null && s.length()>0){chance = Double.parseDouble(s);}
83
                s=getParameter("bins");
84
                if(s!=null && s.length()>0){bins_num = Integer.parseInt(s, 10);}
85
                s=getParameter("speed");
86
                if(s!=null && s.length()>0){speed = Integer.parseInt(s, 10);}
87
                s=getParameter("xsize");
88
                if(s!=null && s.length()>0){frame_x = Integer.parseInt(s, 10);}
89
                s=getParameter("ysize");
90
                if(s!=null && s.length()>0){frame_y = Integer.parseInt(s, 10);}
91
                s=getParameter("title");
92
                if(s!=null && s.length()>0){title=s;}
93
                s=getParameter("font_size");
94
                if(s!=null && s.length()>0){font_size = Integer.parseInt(s, 10);}
95
 
96
            }
97
        }
98
        s=getParameter("language");
99
        if(s!=null && s.length()>0){
100
            if(s.equalsIgnoreCase("nl")){
101
                click_text="KLIK HIER OM TE BEGINNEN";
102
                start_text="START";
103
                stop_text="STOP";
104
                clear_text="WISSEN";
105
                close_text="SLUITEN";
106
                label_count="Aantal: ";
107
                label_mean="Gemiddeld: ";
108
                label_variance="Variantie: ";
109
                label_bin="Bakje: ";
110
                label_bins="Bakjes: ";
111
                label_speed="Snelheid: ";
112
                label_bin_count="Ballen/bakje: ";
113
                label_probability="Kans: ";    
114
                label_bin_probability="Kans per bakje: ";
115
                label_confidence="Betrouwbaarheids interval: ";
116
                some_text=" % van de ballen in bakje: ";
117
                through=" t/m ";
118
                String label_controls=" Menu ";
119
                String label_statistics="Statistiek";
120
            }
121
            if(s.equalsIgnoreCase("fr")){
122
                click_text="CLIQUEZ ICI";
123
                start_text="COMMENCER";
124
                stop_text="PAUSE";
125
                clear_text="EFFACER";
126
                close_text="FERMER";
127
                label_count="Quantit\u00E9 : ";
128
                label_mean="Moyenne : ";
129
                label_variance="Variance: ";
130
                label_bin="Panier : ";
131
                label_bins="Paniers : ";
132
                label_speed="Vitesse : ";
133
                label_bin_count="Balles dans ce panier : ";
134
                label_bin_probability="% de balles dans ce panier : ";
135
                label_probability="Probabilit\u00E9 : ";    
136
                label_confidence="Intervalle de confiance : ";
137
                some_text=" % de balles dans le panier ";
138
                through=" through ";
139
                label_controls="Menu";
140
                label_statistics="Statistiques";
141
            }
142
            if(s.equalsIgnoreCase("de")){
143
                click_text="Klicken Sie hier um zu starten";
144
                start_text="START";
145
                stop_text="STOP";
146
                clear_text="CLEAR";
147
                close_text="CLOSE";
148
                label_count="Zahl: ";
149
                label_mean="Mean: ";
150
                label_variance="Variance: ";
151
                label_bin="Behälter: ";
152
                label_bins="Behälter: ";
153
                label_speed="Geschwindigkeit : ";
154
                label_bin_count="Zahl/Behälter: ";
155
                label_bin_probability="Wahrscheinlichkeit in Behälter: ";
156
                label_probability="Wahrscheinlichkeit: ";    
157
                label_confidence="Wahrscheinlichkeits Intervall: ";
158
                some_text=" % der Kugeln fällt in Behälter ";
159
                through=" bis ";
160
                String label_controls=" Menu ";
161
                String label_statistics="Statistik";
162
            }
163
        }
164
        setBackground(Color.white);
165
        frame = new JFrame();
166
        frame.setVisible(false);
167
        frame.setSize(frame_x, frame_y);
168
        frame.setLocation(0,0);
169
        frame.setTitle( title );
170
        Font font = new Font( "Helvetica", Font.BOLD, font_size );
171
        GridBagLayout gridbaglayout = new GridBagLayout();
172
        GridBagConstraints constraints = new GridBagConstraints();
173
        constraints.ipadx = 5;
174
        constraints.ipady = 5;
175
        constraints.insets = new Insets( 1,1,1,1 );
176
        constraints.anchor = GridBagConstraints.CENTER;
177
        constraints.fill = GridBagConstraints.NONE;
178
        constraints.weightx = 1.0;
179
        JPanel controls_west = new JPanel(  );
180
        JLabel label = new JLabel( label_bins,JLabel.LEFT );
181
        controls_west.add( label );
182
        bins = new JSpinner( new SpinnerNumberModel(bins_num,2,101,1) );
183
        controls_west.add( bins );
184
        label = new JLabel( label_probability,JLabel.LEFT );
185
        controls_west.add( label );
186
        prob = new JSpinner( new SpinnerNumberModel(0.50,0.00,100,0.01) );
187
        SpinnerNumberModel model = (SpinnerNumberModel)prob.getModel();
188
        model.setMaximum( new Double(1.00) );
189
        controls_west.add( prob );
190
        label = new JLabel( label_speed,JLabel.LEFT );
191
        controls_west.add( label );
192
        rate = new JSpinner( new SpinnerNumberModel(1,1,10,1) );
193
        controls_west.add( rate );
194
        JPanel controls_east = new JPanel();
195
        controls_east.add( start = new JButton( start_text ) );
196
        start.setDefaultCapable( true );
197
        frame.getRootPane().setDefaultButton( start );
198
        controls_east.add( clear = new JButton( clear_text ) );
199
        controls_east.add( close = new JButton( close_text ) );
200
        close.setDefaultCapable( false );      
201
        JPanel controls = new JPanel( new BorderLayout() );
202
        controls.add( "East", controls_east );
203
        JPanel statistics_center = new JPanel( new GridLayout(2,3) );
204
        statistics_center.add( count = new JLabel( label_count ) );
205
        statistics_center.add( mean = new JLabel( label_mean ) );
206
        statistics_center.add( variance = new JLabel( label_variance ) );
207
        statistics_center.add( current_bin = new JLabel( label_bin ) );
208
        statistics_center.add( current_bin_count = new JLabel(label_bin_count ) );
209
        statistics_center.add( current_bin_prob = new JLabel( label_bin_probability ) );
210
        JPanel statistics_south = new JPanel( new GridLayout(1,1) );
211
        statistics_south.add( confidence = new JLabel( label_confidence ) );
212
        JPanel statistics = new JPanel( new BorderLayout() );
213
        if(wims_exercise == false){
214
            // hmmm...these controls are handed over to applet params...if applet is part of an interactive exercise.
215
            controls.add( "West", controls_west );
216
            controls.setBorder( BorderFactory.createTitledBorder( controls.getBorder(), label_controls, TitledBorder.LEFT, TitledBorder.TOP, new Font( "Helvetica", Font.BOLD, font_size) ) );
217
        }
218
        statistics.add( "Center", statistics_center );
219
        statistics.add( "South", statistics_south );
220
        statistics.setBorder( BorderFactory.createTitledBorder( statistics.getBorder(), label_statistics, TitledBorder.LEFT, TitledBorder.TOP, new Font( "Helvetica", Font.BOLD, font_size) ) );
221
 
222
        JPanel south = new JPanel( new BorderLayout() );
223
        south.add( "Center", statistics );
224
        JLabel statusbar = new JLabel("");
225
        statusbar.setPreferredSize( new Dimension(15,15) );
226
        south.add( "South", statusbar );
227
        Container contentpane = frame.getContentPane();
228
        contentpane.setLayout(new BorderLayout(10,10));
229
        contentpane.add( "Center", plinkoboard = new PlinkoBoard(this) );
230
        contentpane.add( "North", controls );
231
        contentpane.add( "South", south );
232
        start.addActionListener( this );
233
        clear.addActionListener( this );
234
        close.addActionListener( this );
235
        bins.addChangeListener( this );
236
        rate.addChangeListener( this );
237
        prob.addChangeListener( this );
238
 
239
        plinkoboard.requestFocus();
240
        frame.addWindowListener( this );
241
        getContentPane().add( splash = new SplashPanel( this ) );
242
        click = getAudioClip( getCodeBase(), "sounds/click.au" );
243
        ping = getAudioClip( getCodeBase(), "sounds/ping.au" );
244
    }
245
 
246
        // jm.evers: returns a string to a javascript function ReadApplet(); [must be a string, and not an array ... IE trouble]
247
        // the string will be send -along with the "student reply" to the questions at hand- to the WIMS server; 
248
        public String ReadApplet(){
249
            String s=plinkoboard.ReadData();
250
            return s;                                                                                                                      
251
        }                                                                                                                                  
252
 
253
        public void showFrame(){
254
                frame.setVisible( true );
255
        }
256
 
257
        public void stop(){
258
                frame.setVisible( false );
259
                splash.start();
260
        }
261
 
262
        public void run(){             
263
            //while ( active  || countdown > 0 ){
264
            while ( active ){
265
                plinkoboard.dropBall( false );
266
                //if ( countdown > 0 ) countdown--;
267
                try {
268
                //if ( countdown < 1)
269
                    if(wims_exercise){
270
                        Thread.sleep(105 - 10*( (int) speed ));
271
                    }
272
                    else
273
                    {
274
                        Thread.sleep(105 - 10*((Integer)rate.getValue()).intValue());
275
                    }
276
                } catch (InterruptedException e){}
277
            }
278
        }
279
 
280
        public void toggleStart(){
281
            if ( active ){
282
                active = false;
283
                start.setText(start_text);
284
            }
285
            else
286
            {
287
                active = true;
288
                bins.setEnabled( false );
289
                thread = new Thread(this);
290
                thread.start();
291
                start.setText(stop_text);
292
            }
293
        }
294
 
295
        public void actionPerformed( ActionEvent ae ){
296
            Object obj = ae.getSource();
297
            if (obj == start){toggleStart();plinkoboard.requestFocus();}
298
            if( obj == clear ){
299
                if ( plinkoboard.FIRST_BALL == null ){plinkoboard.newHist();}
300
                else
301
                {
302
                    plinkoboard.FIRST_BALL = null;
303
                    //plinkoboard.BALL_COUNT = 0;
304
                    if ( !active ){bins.setEnabled( true );}
305
                }
306
                    plinkoboard.repaint();plinkoboard.requestFocus();
307
            }
308
            if(obj == close){stop();}
309
        }
310
 
311
        public void stateChanged( ChangeEvent ce ){
312
            Object obj = ce.getSource();
313
            if ( obj == bins ){
314
                count.setText( "0" );
315
                plinkoboard.setup( );
316
                plinkoboard.newHist( );
317
                plinkoboard.drawBackground();
318
            } else if ( obj == rate ){
319
            } else if ( obj == prob ){
320
                plinkoboard.updatePercent();
321
                plinkoboard.repaint();
322
            }
323
        }
324
 
325
        public void windowActivated( WindowEvent we ){
326
            //splash.start();
327
        }
328
 
329
 
330
        public void windowClosed( WindowEvent we ){
331
                //splash.start();
332
        }
333
 
334
        public void windowClosing( WindowEvent we ){
335
                //splash.start();
336
        }
337
 
338
        public void windowDeactivated( WindowEvent we ){
339
                //splash.start();
340
        }
341
 
342
        public void windowDeiconified( WindowEvent we ){}
343
 
344
        public void windowIconified( WindowEvent we ){}
345
 
346
        public void windowOpened( WindowEvent we ){}
347
 
348
        public String getAppletInfo(){
349
            return "Written by Dr. P. Little \n http://www.math.psu.edu/dlittle/java/probability/plinko/index.html" ;
350
        }  
351
 
352
/*             
353
        public void keyTyped( KeyEvent ke ){
354
            int code = ke.getKeyCode();
355
            char key = ke.getKeyChar();
356
 
357
            if ( key >= '0' && key <= '4' ){
358
                int x = key - '0';
359
                int n = 1;
360
                for (int i=0; i<x; i++ ){
361
                    n *= 10;
362
                }
363
                for (int i=0; i<n; i++){
364
                    plinkoboard.dropBall();
365
                }
366
            } else if ( key == ' ' ){
367
                        toggleStart();
368
            } else if (key==20){ //control t - toggle erasing
369
                        plinkoboard.toggleErase();
370
            } else if (key==3){ //control c - clear screen
371
                        plinkoboard.newHist();
372
            } else if (key==24){ //control x - kill all threads and clear screen
373
                        plinkoboard.kill();
374
            } else if (key==16){ //control p - toggle displaying probabilities
375
                        //plinkoboard.toggleProbabilities();
376
            }
377
        }
378
 
379
        public void keyPressed( KeyEvent ke ){
380
        }
381
 
382
        public void keyReleased( KeyEvent ke ){
383
        }*/
384
 
385
}
386