//---------------------------------------------------------------------- // Dining Philosphers GUI © 1997 David Whitney // // PhilosopherGUI -- Observe the Dining Philospohers and draw a graphic // representation of them dining at their table. // // David Whitney dwhitney@cs.stanford.edu // August 9, 1997 //---------------------------------------------------------------------- //import java.applet.Applet; // total hack to play audio //import java.applet.AudioClip; import java.awt.*; import java.awt.image.*; import java.util.*; import java.io.*; import Philosopher; import LabelledSlider; import PhilosophersTablePicture; public class DiningPhilosophersComponent extends Panel { DiningPhilosophers _philosophers; float _speed; // from 0 to 1 LabelledSlider _speedWidget; LabelledSlider _thinkWidget; LabelledSlider _eatWidget; PhilosophersTablePicture _philosopherView; static final String EatingChoice = "Dining"; static final String TalkingChoice = "Talking"; static final String LaughingChoice = "Laughing"; static final String MuteChoice = "Mute"; //---------------------------------------------------------------------- // Constructor for a Dining Philosphers Component Panel //---------------------------------------------------------------------- public DiningPhilosophersComponent() { _philosophers = new DiningPhilosophers( 5 ); _philosophers.start(); _philosophers.suspend(); // create the philosophers, but don't set them // free yet. _philosophers.setSpeed( 1000 ); // pauses in milliseconds, should be different. _philosophers.setThinkChance( 0.75f ); _philosophers.setEatChance( 0.75f ); setLayout( new BorderLayout() ); _philosopherView = new PhilosophersTablePicture( _philosophers ); _philosophers.addObserver( _philosopherView ); // new Thread( philosopherView ).start(); Panel choicePanel = new Panel(); choicePanel.setLayout( new FlowLayout() ); Choice soundMenu = new Choice(); soundMenu.addItem( EatingChoice ); soundMenu.addItem( TalkingChoice ); soundMenu.addItem( LaughingChoice ); soundMenu.addItem( MuteChoice ); choicePanel.add( soundMenu ); choicePanel.add( new Label("Philosophers") ); _speedWidget = new LabelledSlider("Speed ", _philosophers.getSpeed(), 0, 10000 ); _thinkWidget = new LabelledSlider("Think %", _philosophers.getThinkChance() ); _eatWidget = new LabelledSlider("Eat % ", _philosophers.getEatChance() ); Panel sliderPanel = new Panel(); sliderPanel.setLayout( new GridLayout(4,1) ); sliderPanel.add( new Checkbox("Show sticks")); sliderPanel.add( _speedWidget ); sliderPanel.add( _thinkWidget ); sliderPanel.add( _eatWidget ); add("North", choicePanel ); add("Center", _philosopherView ); add("South", sliderPanel ); invalidate(); repaint(); } //---------------------------------------------------------------------- // Accessors //---------------------------------------------------------------------- public DiningPhilosophers getPhilosophers() { return _philosophers; } //---------------------------------------------------------------------- // Thread control //---------------------------------------------------------------------- /* public void start() { _philosopherView.resume(); } public void stop() { _philosopherView.suspend(); } public void destroy() { _philosopherView.stop(); } */ //---------------------------------------------------------------------- // I don't know why this needs to run just so the GUI compenents can be heard. //---------------------------------------------------------------------- public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException ex) {} } } //---------------------------------------------------------------------- // handle action events. Sliders generate actions when they get new values //---------------------------------------------------------------------- public boolean action( Event inEvent, Object inWhat ) { if (inEvent.target instanceof Slider) { Slider slider = (Slider) inEvent.target; if (slider == _speedWidget.getSlider() ) _philosophers.setSpeed( (int) (slider.getValue()) ); else if (slider == _thinkWidget.getSlider() ) _philosophers.setThinkChance( slider.getValue() ); else if (slider == _eatWidget.getSlider() ) _philosophers.setEatChance( slider.getValue() ); else System.err.println("action Error"); } else if (inEvent.target instanceof Choice) { Choice menu = (Choice) inEvent.target; String audio = "error"; if (menu.getSelectedItem().equals( EatingChoice )) audio = "eat"; else if (menu.getSelectedItem().equals( TalkingChoice )) audio = "talk"; else if (menu.getSelectedItem().equals( LaughingChoice )) audio = "laugh"; else if (menu.getSelectedItem().equals( MuteChoice )) audio = "null"; System.out.println( audio ); _philosopherView.setAudioName( audio ); } else if (inEvent.target instanceof Checkbox) { _philosopherView.setSticksDrawn( ((Checkbox)inEvent.target).getState() ); } else return false; return true; } } // end of class