Java tutorial
/* * Copyright (c) 1996 Artima Software Company. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for EVALUATION purposes only * is hereby granted provided that this copyright notice * appears in all copies. "Evaluation purposes" are any uses which * do not constitute the sale, sharing, or redistribution of this * software with or to any other persons in any medium. * * ARTIMA SOFTWARE COMPANY MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT * THE SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. ARTIMA SOFTWARE COMPANY * SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. * */ /* * ExposedInt.java * * This file contains all the code for the signed twos-complement int demo * applet, named Exposed Int, that accompanies the JavaWorld Under The Hood * article titled, "Logic and Integer Arithmetic". * * Bill Venners, September 1996 * */ import java.awt.*; import java.applet.*; /** * An applet that interactively demonstrates the format and behavior * of signed twos-complement ints in Java. * * @author Bill Venners * */ public class ExposedInt extends Applet { private Label binaryField; private Label hexField; private Label decimalField; private int value; private GrayButton maximumButton = new GrayButton(ExposedIntStringTable.max); private GrayButton minimumButton = new GrayButton(ExposedIntStringTable.min); private GrayButton zeroButton = new GrayButton(ExposedIntStringTable.zero); public void init() { Panel buttonPanel = new PanelWithInsets(0, 0, 0, 0); buttonPanel.setLayout(new GridLayout(3, 2, 5, 5)); buttonPanel.add(new GrayButton(ExposedIntStringTable.increment)); buttonPanel.add(new GrayButton(ExposedIntStringTable.decrement)); buttonPanel.add(minimumButton); buttonPanel.add(maximumButton); buttonPanel.add(zeroButton); buttonPanel.add(new GrayButton(ExposedIntStringTable.negate)); zeroButton.disable(); binaryField = new Label("00000000000000000000000000000000"); hexField = new Label("00000000"); decimalField = new Label("0"); Font fieldFont = new Font("TimesRoman", Font.PLAIN, 12); binaryField.setFont(fieldFont); hexField.setFont(fieldFont); decimalField.setFont(fieldFont); Panel numberPanel = new Panel(); numberPanel.setBackground(Color.white); numberPanel.setLayout(new GridLayout(3, 1)); Panel binaryPanel = new Panel(); binaryPanel.setLayout(new BorderLayout()); binaryPanel.add("Center", binaryField); numberPanel.add(binaryPanel); Panel hexPanel = new Panel(); hexPanel.setLayout(new BorderLayout()); hexPanel.add("Center", hexField); numberPanel.add(hexPanel); numberPanel.add(decimalField); Panel labelPanel = new Panel(); labelPanel.setBackground(Color.white); labelPanel.setLayout(new GridLayout(3, 1)); Label label = new Label(ExposedIntStringTable.binary, Label.CENTER); Font labelFont = new Font("Helvetica", Font.ITALIC, 11); label.setFont(labelFont); labelPanel.add(label); label = new Label(ExposedIntStringTable.hex, Label.CENTER); label.setFont(labelFont); labelPanel.add(label); label = new Label(ExposedIntStringTable.decimal, Label.CENTER); label.setFont(labelFont); labelPanel.add(label); Panel dataPanel = new Panel(); dataPanel.setLayout(new BorderLayout()); dataPanel.add("West", labelPanel); dataPanel.add("Center", numberPanel); ColoredLabel title = new ColoredLabel(ExposedIntStringTable.title, Label.CENTER, Color.yellow); title.setFont(new Font("Helvetica", Font.BOLD, 12)); setBackground(Color.red); setLayout(new BorderLayout(5, 5)); add("North", title); add("West", buttonPanel); add("Center", dataPanel); } public boolean action(Event evt, Object arg) { if (evt.target instanceof Button) { String bname = (String) arg; if (bname.equals(ExposedIntStringTable.increment)) { ++value; } else if (bname.equals(ExposedIntStringTable.decrement)) { --value; } else if (bname.equals(ExposedIntStringTable.min)) { value = 0x80000000; } else if (bname.equals(ExposedIntStringTable.max)) { value = 0x7fffffff; } else if (bname.equals(ExposedIntStringTable.zero)) { value = 0; } else if (bname.equals(ExposedIntStringTable.negate)) { value *= -1; } UpdateNumberFields(); enableDisableButton(maximumButton, Integer.MAX_VALUE); enableDisableButton(minimumButton, Integer.MIN_VALUE); enableDisableButton(zeroButton, 0); } return true; } void enableDisableButton(Button b, int val) { if (!b.isEnabled()) { if (value != val) { b.enable(); } } else if (value == val) { b.disable(); } } void UpdateNumberFields() { decimalField.setText(Integer.toString(value)); int v = value; StringBuffer buf = new StringBuffer(); for (int i = 0; i < 8; ++i) { // Get lowest bit int remainder = v & 0xf; // Convert bit to a character and insert it into the beginning of the string switch (remainder) { case 0: buf.insert(0, "0"); break; case 1: buf.insert(0, "1"); break; case 2: buf.insert(0, "2"); break; case 3: buf.insert(0, "3"); break; case 4: buf.insert(0, "4"); break; case 5: buf.insert(0, "5"); break; case 6: buf.insert(0, "6"); break; case 7: buf.insert(0, "7"); break; case 8: buf.insert(0, "8"); break; case 9: buf.insert(0, "9"); break; case 10: buf.insert(0, "a"); break; case 11: buf.insert(0, "b"); break; case 12: buf.insert(0, "c"); break; case 13: buf.insert(0, "d"); break; case 14: buf.insert(0, "e"); break; case 15: buf.insert(0, "f"); break; } // Shift the int to the right one bit v >>>= 4; } hexField.setText(buf.toString()); v = value; buf.setLength(0); for (int i = 0; i < 32; ++i) { // Get lowest bit int remainder = v & 0x1; // Convert bit to a character and insert it into the beginning of the string if (remainder == 0) { buf.insert(0, "0"); } else { buf.insert(0, "1"); } // Shift the int to the right one bit v >>>= 1; } binaryField.setText(buf.toString()); } public Insets insets() { return new Insets(5, 5, 5, 5); } } class ExposedIntStringTable { public static final String title = "EXPOSED INT"; public static final String binary = "binary"; public static final String hex = "hex"; public static final String decimal = "decimal"; public static final String max = "Max"; public static final String min = "Min"; public static final String zero = "Zero"; public static final String increment = "++"; public static final String decrement = "--"; public static final String negate = "*=(-1)"; } // I used this class because I can't seem to set the background color of // a label. I only want a label, but I want the backgound to be gray. class ColoredLabel extends Panel { private Label theLabel; ColoredLabel(String label, int alignment, Color color) { setLayout(new GridLayout(1, 1)); setBackground(color); theLabel = new Label(label, alignment); add(theLabel); } public void setLabelText(String s) { theLabel.setText(s); } public Insets insets() { return new Insets(0, 0, 0, 0); } } class GrayButton extends Button { GrayButton(String label) { super(label); setBackground(Color.lightGray); } } class PanelWithInsets extends Panel { private int top; private int left; private int bottom; private int right; PanelWithInsets(int t, int l, int b, int r) { top = t; left = l; bottom = b; right = r; } PanelWithInsets() { top = 5; left = 5; bottom = 5; right = 5; } public Insets insets() { return new Insets(top, left, bottom, right); } }