import java.applet.*; import java.awt.*; import javax.swing.JFrame; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import java.text.*; import java.util.Hashtable; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import javax.swing.JComponent; //this is new and improved totally general array-pattern-generator applet //with good layout. //something is wrong with: //layout //updating from the text fields //--maybe give them separate classes like the sliders have. public class MApplet extends JApplet { double a, b, lowfa, lowfb, phi, fmult; int n, xp, yp; JLabel aLabel; JLabel bLabel; JLabel nLabel; JLabel xpLabel; JLabel ypLabel; JLabel fLabel; JLabel phiLabel; JSlider freqslider; JSlider phislider; JFormattedTextField aField; JFormattedTextField bField; JFormattedTextField nField; JFormattedTextField xpField; JFormattedTextField ypField; NumberFormat aFormat; NumberFormat bFormat; NumberFormat nFormat; NumberFormat xpFormat; NumberFormat ypFormat; JPanel fieldpane; JPanel labelpane; Box controlarea; Box fieldandlabelarea; Hashtable fTable; Hashtable phiTable; Container contentPane; JButton updateButton; ActionListener buttonListener; MPaintPanel graph; //add a button that circumvents my changelistener issues. public void init(){ aFormat = NumberFormat.getNumberInstance(); bFormat = NumberFormat.getNumberInstance(); nFormat = NumberFormat.getNumberInstance(); xpFormat = NumberFormat.getNumberInstance(); ypFormat = NumberFormat.getNumberInstance(); contentPane = getContentPane(); updateButton = new JButton("Update quantities"); updateButton.setVerticalTextPosition(AbstractButton.CENTER); updateButton.setHorizontalTextPosition(AbstractButton.CENTER); updateButton.addActionListener(buttonListener); updateButton.setActionCommand("update"); lowfa = 40; lowfb = 40; aLabel = new JLabel("plate x dimension at lowest freq: "); bLabel = new JLabel("plate y dimension at lowest freq: "); aField = new JFormattedTextField(aFormat); bField = new JFormattedTextField(bFormat); aField.setValue(new Double(lowfa)); bField.setValue(new Double(lowfb)); aField.setColumns(5); bField.setColumns(5); //let there be text fields for a and b. freqslider=new JSlider(100, 25000, 100); //multiplier on lowest freq fLabel = new JLabel("frequency, in multiples of lowest frequency: "); fmult=1; fTable = new Hashtable(); fTable.put(new Integer(100), new JLabel("1")); fTable.put(new Integer(5000), new JLabel("50")); fTable.put(new Integer(10000), new JLabel("100")); fTable.put(new Integer(15000), new JLabel("150")); fTable.put(new Integer(20000), new JLabel("200")); fTable.put(new Integer(25000), new JLabel("250")); freqslider.setLabelTable(fTable); freqslider.addChangeListener(new SListener()); freqslider.setPaintLabels(true); a=fmult*lowfa; b=fmult*lowfb; phislider=new JSlider(0, 628, 0); phiLabel = new JLabel("azimuthal angle"); phiTable = new Hashtable(); phiTable.put(new Integer(0), new JLabel(""+0)); phiTable.put(new Integer(157), new JLabel("0.5 PI")); phiTable.put(new Integer(314), new JLabel("1.0 PI")); phiTable.put(new Integer(471), new JLabel("1.5 PI")); phiTable.put(new Integer(628), new JLabel("2.0 PI")); phislider.setLabelTable(phiTable); phislider.setPaintLabels(true); phislider.addChangeListener(new PListener()); phi=0; n=50; //elements per plate: text field nLabel = new JLabel("number of elements per plate"); nField = new JFormattedTextField(nFormat); nField.setValue(new Integer(n)); nField.setColumns(3); xp=2; yp=2; //this is an xp by yp array of plates. text fields. xpLabel = new JLabel("number of columns in plate array"); ypLabel = new JLabel("number of rows in plate array"); xpField = new JFormattedTextField(xpFormat); ypField = new JFormattedTextField(ypFormat); xpField.setValue(new Integer(xp)); ypField.setValue(new Integer(yp)); xpField.setColumns(5); ypField.setColumns(5); graph = new MPaintPanel(a, b, phi, n, xp, yp); BoxLayout contentLayout = new BoxLayout(contentPane, BoxLayout.PAGE_AXIS); controlarea = new Box(BoxLayout.PAGE_AXIS); fieldandlabelarea=new Box(BoxLayout.LINE_AXIS); labelpane = new JPanel(new GridLayout(0,1)); labelpane.add(aLabel); labelpane.add(bLabel); labelpane.add(nLabel); labelpane.add(xpLabel); labelpane.add(ypLabel); fieldpane = new JPanel(new GridLayout(0,1)); fieldpane.add(aField); fieldpane.add(bField); fieldpane.add(nField); fieldpane.add(xpField); fieldpane.add(ypField); fieldandlabelarea.add(labelpane); fieldandlabelarea.add(fieldpane); fieldandlabelarea.add(updateButton); controlarea.add(fLabel); controlarea.add(freqslider); controlarea.add(phiLabel); controlarea.add(phislider); controlarea.add(fieldandlabelarea); contentPane.setLayout(contentLayout); contentPane.add(graph); contentPane.add(controlarea); } class SListener implements ChangeListener{ public void stateChanged(ChangeEvent e){ JSlider source = (JSlider)e.getSource(); fmult=(double)source.getValue()/100.0; a=lowfa*fmult; b=lowfb*fmult; graph.update(a, b, phi, n, xp, yp); } } class PListener implements ChangeListener{ public void stateChanged(ChangeEvent e){ JSlider source = (JSlider)e.getSource(); phi = (double)source.getValue()/100.0; graph.update(a, b, phi, n, xp, yp); } } public void actionPerformed(ActionEvent e){ lowfa=((Number)aField.getValue()).doubleValue(); lowfb=((Number)bField.getValue()).doubleValue(); a=fmult*lowfa; b=fmult*lowfb; n=((Number)nField.getValue()).intValue(); xp=((Number)xpField.getValue()).intValue(); yp=((Number)ypField.getValue()).intValue(); graph.update(a, b, phi, n, xp, yp); System.out.println("quantities updated: a="+a+" b="+b+" n="+n+" xp="+xp+" yp="+yp); } }