/*******************************/ /* NimCalculator.java */ /* Glenn A. Richard */ /* November 13, 2000 */ /* Glenn.Richard@sunysb.edu */ /*******************************/ import javax.swing.*; import java.awt.*; import java.awt.event.*; public class NimCalculator extends JPanel implements ActionListener { private JLabel titleLabel; private JTextField decimalField[]; private JLabel binaryPlaceLabel[]; private JTextField binaryField[][]; private JButton decrementButton[]; private JTextField nimSumField[]; private JLabel decimalLabel; private JLabel binaryLabel; private JLabel nimSumLabel; private int count[] = {11, 9, 7}; public NimCalculator() { // constructor GridBagLayout gbl; GridBagConstraints gbc; gbl = new GridBagLayout(); gbc = new GridBagConstraints(); setLayout(gbl); setBackground(new Color(255, 255, 214)); Font font; int binaryPlace; // set up screen components titleLabel = new JLabel("Nim Sum Calculator"); font = titleLabel.getFont().deriveFont(Font.BOLD); buildConstraints(gbc, 0, 0, 10, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(titleLabel, gbc); titleLabel.setForeground(Color.black); add(titleLabel); decimalLabel = new JLabel("Decimal"); buildConstraints(gbc, 0, 1, 1, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(decimalLabel, gbc); decimalLabel.setForeground(Color.red); add(decimalLabel); binaryLabel = new JLabel("Binary"); buildConstraints(gbc, 1, 1, 8, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(binaryLabel, gbc); binaryLabel.setForeground(Color.blue); add(binaryLabel); binaryPlaceLabel = new JLabel[8]; binaryPlace = 1; for (int i = 7; i >= 0; i--) { binaryPlaceLabel[i] = new JLabel("" + binaryPlace); buildConstraints(gbc, i + 1, 2, 1, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(binaryPlaceLabel[i], gbc); binaryPlaceLabel[i].setForeground(Color.blue); add(binaryPlaceLabel[i]); binaryPlace *= 2; } nimSumLabel = new JLabel("Nim Sum"); buildConstraints(gbc, 0, 6, 1, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(nimSumLabel, gbc); nimSumLabel.setForeground(Color.black); add(nimSumLabel); decimalField = new JTextField[3]; binaryField = new JTextField[3][8]; decrementButton = new JButton[3]; nimSumField = new JTextField[8]; for (int i = 0; i < 3; i++) { decimalField[i] = new JTextField(4); decimalField[i].addActionListener(this); buildConstraints(gbc, 0, i + 3, 1, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(decimalField[i], gbc); decimalField[i].setFont(font); decimalField[i].setForeground(Color.red); decimalField[i].setHorizontalAlignment(SwingConstants.RIGHT); add(decimalField[i]); for (int j = 0; j < 8; j++) { binaryField[i][j] = new JTextField(2); binaryField[i][j].addActionListener(this); buildConstraints(gbc, j + 1, i + 3, 1, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(binaryField[i][j], gbc); binaryField[i][j].setFont(font); binaryField[i][j].setForeground(Color.blue); binaryField[i][j].setHorizontalAlignment(SwingConstants.RIGHT); add(binaryField[i][j]); } decrementButton[i] = new JButton("Subtract 1"); decrementButton[i].addActionListener(this); buildConstraints(gbc, 9, i + 3, 1, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(decrementButton[i], gbc); decrementButton[i].setForeground(Color.black); add(decrementButton[i]); } for (int i = 0; i < 8; i++) { nimSumField[i] = new JTextField(2); buildConstraints(gbc, i + 1, 6, 1, 1, 100, 100, GridBagConstraints.NONE, GridBagConstraints.CENTER); gbl.setConstraints(nimSumField[i], gbc); nimSumField[i].setFont(font); nimSumField[i].setForeground(Color.black); nimSumField[i].setHorizontalAlignment(SwingConstants.RIGHT); nimSumField[i].setEditable(false); nimSumField[i].setForeground(Color.black); nimSumField[i].setBackground(Color.white); add(nimSumField[i]); } // place the numerical values in the text fields setFields(); } public void actionPerformed(ActionEvent ae) { // respond to button clicks and hits of the enter key in text fields Object source = ae.getSource(); for (int i = 0; i < 3; i++) { if (source == decrementButton[i]) { if (count[i] > 0) count[i]--; setFields(); return; } if (source == decimalField[i]) { try { count[i] = Integer.parseInt(decimalField[i].getText()); } catch (NumberFormatException nfe) { decimalField[i].setText("0"); count[i] = Integer.parseInt(decimalField[i].getText()); } if (count[i] < 0) count[i] = 0; else if (count[i] > 255) count[i] = 255; setFields(); return; } for (int j = 0; j < 8; j++) if (source == binaryField[i][j]) { int binaryDigit; int sum = 0; try { binaryDigit = Integer.parseInt(binaryField[i][j].getText()); } catch (NumberFormatException nfe) { binaryField[i][j].setText("0"); binaryDigit = Integer.parseInt(binaryField[i][j].getText()); } if (binaryDigit < 0) binaryField[i][j].setText("0"); else if (binaryDigit > 1) binaryField[i][j].setText("1"); for (int k = 0; k < 8; k++) { sum *= 2; sum += Integer.parseInt(binaryField[i][k].getText()) % 2; } count[i] = sum; setFields(); return; } } setFields(); } private void setFields() { // set the numerical values in the text fields int countWork[]; int nimSumWork[]; countWork = new int[3]; nimSumWork = new int[8]; for (int i = 0; i < 8; i++) nimSumWork[i] = 0; for (int i = 0; i < 3; i++) { countWork[i] = count[i]; decimalField[i].setText("" + count[i]); for (int j = 0; j < 8; j++) { binaryField[i][7 - j].setText("" + countWork[i] % 2); nimSumWork[j] += (countWork[i] % 2); countWork[i] /= 2; } } for (int i = 0; i < 8; i++) { nimSumField[7 - i].setText("" + (nimSumWork[i] % 2)); } } private static void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy, int fill, int anchor) { // build the constraints for the GridBagLayout gbc.gridx = gx; gbc.gridy = gy; gbc.gridwidth = gw; gbc.gridheight = gh; gbc.weightx = wx; gbc.weighty = wy; gbc.fill = fill; gbc.anchor = anchor; } }