//BinomialCurve.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; import java.util.*; import java.text.*; public class BinomialCurve extends JApplet implements ActionListener { double p, yScale=1; int n, numBinomials, binNums[], cdfK; JPanel controlPanel; JLabel nLabel, pLabel, yScaleLabel, numBinomialsLabel, cdfLabel; JTextField nTextField, pTextField, yScaleTextField, numBinomialsTextField, cdfTextField; JButton yScaleUpButton, yScaleDownButton, showBinomialsButton; JTextArea binomialtextarea; JScrollPane binomialscrollpane; JSlider cdfSlider; DecimalFormat d4; public void init() { String input; Container container = getContentPane(); container.setLayout( new BorderLayout() ); controlPanel = new JPanel(); controlPanel.setLayout(new FlowLayout()); controlPanel.setBackground(Color.MAGENTA); controlPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); container.add(controlPanel,BorderLayout.NORTH); nLabel = new JLabel( "n" ); controlPanel.add( nLabel ); nTextField = new JTextField("10",3); n = Integer.parseInt(nTextField.getText()); nTextField.setHorizontalAlignment(JTextField.RIGHT); nTextField.addActionListener( this ); controlPanel.add( nTextField ); pLabel = new JLabel( "p" ); controlPanel.add( pLabel ); pTextField = new JTextField("0.5",4); p = Double.parseDouble(pTextField.getText()); pTextField.setHorizontalAlignment(JTextField.RIGHT); pTextField.addActionListener( this ); controlPanel.add( pTextField ); cdfLabel = new JLabel( "CDF" ); controlPanel.add( cdfLabel ); cdfTextField = new JTextField("0",4); cdfTextField.setBackground(Color.GREEN); cdfTextField.setForeground(Color.BLACK); cdfTextField.setHorizontalAlignment(JTextField.RIGHT); cdfTextField.setEditable(false); cdfTextField.addActionListener( this ); controlPanel.add( cdfTextField ); //how to redraw when n changes cdfSlider = new JSlider( SwingConstants.HORIZONTAL, 0, n, 0 ); cdfSlider.setMajorTickSpacing(1); cdfSlider.setPaintTicks(true); cdfSlider.setPaintLabels(true); cdfSlider.setSnapToTicks(true); cdfSlider.addChangeListener( new ChangeListener() { // anonymous inner class // handle change in slider value public void stateChanged( ChangeEvent e ) { cdfK = cdfSlider.getValue(); System.out.println("cdfK="+cdfK); repaint(); } } ); controlPanel.add(cdfSlider); yScaleLabel = new JLabel( "y scale" ); controlPanel.add( yScaleLabel ); yScaleTextField = new JTextField("1",4); yScale = Double.parseDouble(yScaleTextField.getText()); yScaleTextField.setHorizontalAlignment(JTextField.RIGHT); yScaleTextField.addActionListener( this ); controlPanel.add( yScaleTextField ); yScaleUpButton = new JButton( "+" ); controlPanel.add( yScaleUpButton ); yScaleUpButton.addActionListener( this ); yScaleDownButton = new JButton( "-" ); controlPanel.add( yScaleDownButton ); yScaleDownButton.addActionListener( this ); numBinomialsLabel = new JLabel( "Sample size" ); controlPanel.add( numBinomialsLabel ); numBinomialsTextField = new JTextField("100",4); numBinomials = Integer.parseInt(numBinomialsTextField.getText()); numBinomialsTextField.setBackground(Color.BLUE); numBinomialsTextField.setForeground(Color.WHITE); numBinomialsTextField.setHorizontalAlignment(JTextField.RIGHT); numBinomialsTextField.addActionListener( this ); controlPanel.add( numBinomialsTextField ); showBinomialsButton = new JButton( "Show sample" ); controlPanel.add( showBinomialsButton ); showBinomialsButton.addActionListener( this ); d4 = new DecimalFormat (".0000"); binomialtextarea = new JTextArea(20,100); binomialtextarea.setLineWrap( true ); binomialtextarea.setFont( new Font("Courier",Font.BOLD,14) ); binomialscrollpane = new JScrollPane(binomialtextarea); // zTextField.setText("1.0"); //fires listener? no // zTextField.postActionEvent(); } public void actionPerformed( ActionEvent event ) { try { int nTry = Integer.parseInt(nTextField.getText()); double pTry = Double.parseDouble(pTextField.getText()); numBinomials = Integer.parseInt(numBinomialsTextField.getText()); double yScaleTry = Double.parseDouble(yScaleTextField.getText()); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, " must be a number", "BinomialCurve: Invalid input", JOptionPane.ERROR_MESSAGE); return; } if ( event.getSource() == nTextField ) { int oldN = n; n = Integer.parseInt(nTextField.getText()); if (n != oldN ) { cdfSlider.setMaximum(n); //set the new max cdfSlider.setValue(0); //reset to 0 cdfK = 0; } repaint(); } else if ( event.getSource() == numBinomialsTextField ) { numBinomials = Integer.parseInt(numBinomialsTextField.getText()); repaint(); } else if ( event.getSource() == pTextField ) { double oldp = p; p = Double.parseDouble(pTextField.getText()); if (p<0 || p>1.0) { JOptionPane.showMessageDialog(null, "0 <= p <= 1.0", "BinomialCurve: Invalid input", JOptionPane.ERROR_MESSAGE); p = oldp; pTextField.setText(""+d4.format(p)); } else repaint(); } else if ( event.getSource() == yScaleTextField ) { double oldYscale = yScale; yScale = Double.parseDouble(yScaleTextField.getText()); if (yScale < 0) { JOptionPane.showMessageDialog(null, "y scale can not be negative", "NormalCurve: Invalid input", JOptionPane.ERROR_MESSAGE); yScale = oldYscale; yScaleTextField.setText(""+yScale); } else repaint(); } else if ( event.getSource() == yScaleUpButton ) { yScale++; yScaleTextField.setText(""+yScale); repaint(); } else if ( event.getSource() == yScaleDownButton ) { if (yScale > 1) { yScale--; yScaleTextField.setText(""+yScale); repaint(); } } else if ( event.getSource() == showBinomialsButton ) { int k, sum=0, sumSqrd=0; double mean, sd; for (int i=0; i