package lab5; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Scanner; import javax.swing.BoxLayout; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class ArrayView { /** * Sets up the layouts of the GUI, and populates it. * Sets the dimensions of the GUI using pack * and centers the frame on the screen. Sets the * closing operation to terminate the program. * * @param model */ public ArrayView(ArrayData model) { this.model = model; frame.setLayout(new BorderLayout()); leftPanel.setLayout(new GridLayout(0,1)); for (int i = 0; i < fields.length; i++) { fields[i] = new JTextField(20); leftPanel.add(fields[i]); } centerPanel.add(sumField); centerPanel.add(sumButton); frame.add(leftPanel, BorderLayout.LINE_START); frame.add(centerPanel); // use a separate method to add listeners to // the fields and button setUpListeners(); frame.pack(); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } /** * Attach listeners to the active elements of the * GUI. */ private void setUpListeners() { ActionListener temp; for (int i = 0; i < fields.length; i++) { temp = new FieldListener(i); fields[i].addActionListener(temp); } temp = new SumListener(); sumButton.addActionListener(temp); } /** * If the text in the array element fields[i] represents * a number, the number is extracted from the text using * a Scanner object and copied to the corresponding * element of model.storage. * If the text is not a number, no change is made to * model.storage and an error dialog is shown. * @param i - an index of the array fields */ private void copyFieldToArray(int i) { String str = fields[i].getText(); if (str.length() > 0) { Scanner scan = new Scanner(str); if (scan.hasNextDouble()) { model.storage[i] = scan.nextDouble(); } else { JOptionPane.showMessageDialog(frame, "Field " + i + " contains bad data"); } } } /** * Listener for each of the 10 text fields. * When a number is typed into one of the text fields, * the value is copied into the corresponding * element of model.storage when the enter-key is pressed * @author Leslie Lander * */ private class FieldListener implements ActionListener { int index; FieldListener(int i) { index = i; } public void actionPerformed(ActionEvent arg0) { copyFieldToArray(index); } } /** * Listener for the button labeled "SUM" * When clicked the values in the text fields * are written to the data array model.storage * and the sum is calculated * @author Leslie Lander * */ private class SumListener implements ActionListener { public void actionPerformed(ActionEvent arg0) { for (int i = 0; i < fields.length; i++) { copyFieldToArray(i); } double sum = model.arraySum(); sumField.setText("" + sum); } } /** * Displays the values in the array model.storage * in the text fields of this view * */ public void displayArray() { // Show the values in each element of the array // model.storage in text form in the corresponding // field of the view for(int i == 0; i < model.storage.length; i++) { fields[i] = (String)model.storage[i]; } } private JFrame frame = new JFrame("Viewer"); private JPanel leftPanel = new JPanel(); private JPanel centerPanel = new JPanel(); private JTextField sumField = new JTextField(25); private JButton sumButton = new JButton("SUM"); private ArrayData model; // normally we would not use a public field but // this will simplify the code in the driver // for this special exercise public JTextField[] fields = new JTextField[10]; }