import java.applet.Applet; import java.util.Random; import java.awt.*; public class RANDunif2d extends Applet implements Runnable { Canvas canvas = new Canvas(); Button stopButton = new Button("Stop"); Button goButton = new Button("Go"); Button clearButton = new Button("Clear"); Label nbLabel = new Label("Nb of pts (x100):"); GridBagLayout layout = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); long nbpoints = 0; // Double buffering Graphics offGraphics; Image offImage; Dimension offDimension; // Threads boolean frozen = true; Thread drawThread = null; //Random generator Random rand = new Random(45682); public void init() { //Graphic Interface setLayout(layout); setFont(new Font("Helvetica",Font.PLAIN,10)); canvas.resize(150,150); c.fill = GridBagConstraints.VERTICAL; c.gridheight = 10; c.gridwidth = 10; c.gridx = 0; c.gridy = 0; c.insets = new Insets(0,2,0,0); layout.setConstraints(canvas,c); add(canvas); c.gridheight = 1; c.gridwidth = 5; c.gridx = 11; c.gridy = 0; c.fill = GridBagConstraints.BOTH; layout.setConstraints(clearButton,c); add(clearButton); c.gridy = 1; layout.setConstraints(goButton,c); add(goButton); c.gridy = 2; layout.setConstraints(stopButton,c); add(stopButton); nbLabel = new Label("Nb of pts :"); nbLabel.setBackground(Color.white); c.gridy = 3; c.insets = new Insets(4,4,0,4); layout.setConstraints(nbLabel,c); add(nbLabel); nbLabel = new Label("0",Label.CENTER); nbLabel.setBackground(Color.white); c.gridy = 4; c.insets = new Insets(0,4,4,4); layout.setConstraints(nbLabel,c); add(nbLabel); show(); validate(); } public void paint(Graphics g) { update(g); super.repaint(); } public void update(Graphics g) { Dimension d = canvas.size(); //Create the offscreen graphics context, if no good one exists. if ( (offGraphics == null) || (d.width != offDimension.width) || (d.height != offDimension.height) ) { offDimension = d; offImage = createImage(d.width, d.height); offGraphics = offImage.getGraphics(); offGraphics.setColor(Color.blue); offGraphics.fillRect(0,0,d.width-1,d.height-1); offGraphics.setColor(Color.black); offGraphics.drawRect(0,0,d.width-1,d.height-1); offGraphics.setColor(Color.red); } canvas.getGraphics().drawImage(offImage,0,0,canvas); } public void run() { int x,y,i; Dimension dim = canvas.size(); Thread.currentThread().setPriority(Thread.MIN_PRIORITY); while (Thread.currentThread() == drawThread) { for(i=0;i<100;i++) { x = 1+(int)(rand.nextFloat()*(dim.width-2)); y = 1+(int)(rand.nextFloat()*(dim.height-2)); offGraphics.drawLine(x,y,x,y); } nbpoints+=100; nbLabel.setText(Long.toString(nbpoints)); repaint(); try { drawThread.sleep(10); } catch(InterruptedException e) { } } } public void stop() { drawThread = null; } public void start() { if(frozen) {} // Do nothing else { // Start new thread if(drawThread==null) drawThread = new Thread(this,"Draw"); drawThread.start(); } } public boolean action(Event e, Object arg) { Object target = e.target; String str; Dimension d = canvas.size(); if(target==this) { repaint(); return true; } if(target==goButton) { stop(); frozen = false; start(); return true; } if(target==stopButton) { frozen = true; stop(); return true; } if(target==clearButton) { stop(); offGraphics.setColor(Color.blue); offGraphics.fillRect(0,0,d.width-1,d.height-1); offGraphics.setColor(Color.black); offGraphics.drawRect(0,0,d.width-1,d.height-1); offGraphics.setColor(Color.red); nbpoints = 0; nbLabel.setText(Long.toString(nbpoints)); repaint(); start(); return true; } return false; } }