Java Lecture 7

[Previous Lecture] [Lecture Index] [Next Lecture]

FontBrowser.java

import java.awt.*;
import java.awt.event.*;

public class FontBrowser extends Frame {
    public static void main(String args[]) {
      FontBrowser f = new FontBrowser();
      // f.pack(); // `natural' layout
      /* Explicitly set size */
      f.setSize(400, 200);
      /* and location */
      f.setLocation(100, 100);
      f.show(); // display on screen
    }

    FamilySelector family;
    StyleSelector style;
    SizeSelector size;
    FontCanvas c;

    public FontBrowser() {
        super("FontBrowser");

        family = new FamilySelector();
        style = new StyleSelector();
        size = new SizeSelector();

        c = new FontCanvas(
                  family.getCurrentFamily(),
                  style.getCurrentType(),
                  size.getCurrentSize());

        style.setFontCanvas(c);
        family.setFontCanvas(c);
        size.setFontCanvas(c);

        Panel bl_panel = new Panel();
        bl_panel.setLayout(new FlowLayout());
        bl_panel.add(family);
        bl_panel.add(style);

        Panel l_panel = new Panel();
        l_panel.setLayout(new
                        GridLayout(2, 1));
        l_panel.add(c);
        l_panel.add(bl_panel);

        setLayout(new FlowLayout());
        setLayout(new GridLayout(1, 2));
        add(l_panel);
        add(size);

        MenuBar mb = new MenuBar();
        Menu menu;
        MenuItem mi;

        menu = new Menu("File");
        mi = new MenuItem("Reset");
        mi.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    style.reset();
                    family.reset();
                    size.reset();
                }
            }
        );
        menu.add(mi);
        menu.addSeparator();
        mi = new MenuItem("Exit");
        mi.setShortcut(new MenuShortcut(KeyEvent.VK_Q, false));
        mi.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    System.exit(0);
                }
            }
        );
        menu.add(mi);

        mb.add(menu);

        menu = new Menu("Stuff", true);
        menu.add(new MenuItem("No op"));
        mb.add(menu);

        setMenuBar(mb);
    }
}

class FontCanvas extends Canvas {
    private String theFamily;
    private int theStyle;
    private int theSize;
    private Font theFont;

    public FontCanvas(String family, int style,
                int pointSize)
    {
        theFamily = family;
        theStyle = style;
        theSize = pointSize;
        changeFont();
    }
    private void changeFont() {
        theFont = new Font(theFamily, theStyle, theSize);
        setFont(theFont);
        repaint();
    }
    public void paint(Graphics g) {
        Dimension d = getSize();
        String s = "A simple string (|)";
        FontMetrics fm = g.getFontMetrics(theFont);

        int baseline = d.height * 2 / 3;
        int len = fm.stringWidth(s);
        int startx = (d.width - len) / 2;
        g.drawString(s, startx, baseline);

        g.setColor(Color.yellow);
        g.drawLine(startx - 10, baseline,
               startx + len + 10, baseline);
        g.drawLine(startx, baseline - (fm.getAscent() + 5),
               startx, baseline + fm.getDescent() + 5);

        g.setColor(Color.green);
        g.drawRect(startx, baseline - fm.getAscent(),
           len, fm.getAscent() + fm.getDescent());

        g.setColor(Color.red);
        g.drawRect(startx, baseline - fm.getMaxAscent(),
           len, fm.getMaxAscent() + fm.getMaxDescent());

    }
    public void setFamily(String family) {
            theFamily = family;
            changeFont();
    }
    public void setStyle(int style) {
            theStyle = style;
            changeFont();
    }
    public void setSize(int pointSize) {
            theSize = pointSize;
            changeFont();
    }
}

class FamilySelector extends Choice {
    private int current;
    private FontCanvas fontCanvas;
    private String families[];

    public FamilySelector() {
        families = getToolkit().getFontList();

        for (int i = 0; i < families.length; i++)
            addItem(families[i]);

        // Set the current family
        reset();

        // Call setCurrentName() on change
        addItemListener(
            new ItemListener() {
                public void itemStateChanged(ItemEvent ie) {
                    setCurrentName((String)ie.getItem());
                }
            }
        );
    }

    public void setFontCanvas(FontCanvas fc) {
        fontCanvas = fc;
    }

    public String getCurrentFamily() {
        return families[current];
    }

    public void reset() {
        // Current is first element
        setCurrentIndex(0);
    }

    private void setCurrentName(String s) {
        for (int i = 0; i < families.length; i++)
            if (s.equals(families[i])) {
                setCurrentIndex(i);
                return;
            }
        // Hmmm... error
    }

    private void setCurrentIndex(int i) {
        current = i;
        select(i); // update display
        if (fontCanvas != null)
            fontCanvas.setFamily(getCurrentFamily());
    }
}

class StyleSelector extends Choice {
    private StyleInfo current;
    private FontCanvas fontCanvas;

    public StyleSelector() {
        // Fill out Choice items
        for (int i = 0; i < styles.length; i++)
            addItem(styles[i].getName());

        // Set the current style
        reset();

        // Call setCurrentName() on change
        addItemListener(
            new ItemListener() {
                public void itemStateChanged(ItemEvent ie) {
                    setCurrentName((String)ie.getItem());
                }
            }
        );
    }

    public void setFontCanvas(FontCanvas fc) {
        fontCanvas = fc;
    }

    public int getCurrentType() {
        return current.getType();
    }

    public void reset() {
        // Current is first element
        setCurrentIndex(0);
    }

    private void setCurrentName(String s) {
        for (int i = 0; i < styles.length; i++)
            if (s.equals(styles[i].getName()))
            {
                /* Remeber which is current */
                setCurrentIndex(i);
                return;
            }
        // Hmmm... error
    }

    private void setCurrentIndex(int i) {
        current = styles[i];
        select(i); // update display
        if (fontCanvas != null)
            fontCanvas.setStyle(getCurrentType());
    }

    static private class StyleInfo {
        public StyleInfo(String n, int t) {
            name = n;
            type = t;
        }
        public String getName() {
            return name;
        }
        public int getType() {
            return type;
        }
        private String name;
        private int type;
    }
    static private StyleInfo styles[] = {
        new StyleInfo("Plain", Font.PLAIN),
        new StyleInfo("Bold", Font.BOLD),
        new StyleInfo("Italic", Font.ITALIC),
    };
}

class SizeSelector extends List {
    private int current;
    private FontCanvas fontCanvas;
    private static final int MIN_VAL = 3;
    private static final int MAX_VAL = 30;

    public SizeSelector() {
        for (int i = MIN_VAL; i <= MAX_VAL; i++)
           addItem(String.valueOf(i));

        // Set the current family
        reset();

        // Call setCurrentSize() on change
        addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                  int size = 12;
                  try {
                      size = Integer.parseInt(ae.getActionCommand());
                  } catch (NumberFormatException e) {
                      // internal error...
                  }
                  setCurrentSize(size);
                }
            }
        );
    }

    public void setFontCanvas(FontCanvas fc) {
        fontCanvas = fc;
    }

    public int getCurrentSize() {
        return current;
    }

    public void reset() {
        setCurrentSize(11);
        // Make sure it is visible
        makeVisible(current - MIN_VAL);
    }

    private void setCurrentSize(int size) {
        current = size;
        // update display
        select(size - MIN_VAL);
        // Ensure it can be seen in the screen
        if (fontCanvas != null)
            fontCanvas.setSize( getCurrentSize());
    }
}

ImageDraw.java

/*
 * <applet code=ImageDraw width=400 height=400>
 * </applet>
 */
import java.awt.*;
import java.awt.event.*;

public class ImageDraw
    extends java.applet.Applet
{
    public void init() {
        image = getImage(getCodeBase(), "image.gif");

        addMouseMotionListener(
            new MouseMotionAdapter() {
                public void mouseDragged( MouseEvent me) {
                  point = new Point(me.getX(), me.getY());
                  repaint();
                }
            }
        );
    }

    public void paint(Graphics g) {
        if (point != null)
          g.drawImage(image, point.x, point.y, this);
    }

    private Point point;
    private Image image;
}

BufferedImage.java

/*
 * <applet code=BufferedImage width=400 height=400>
 * </applet>
 */
import java.awt.*;
import java.awt.event.*;

public class BufferedImage
    extends java.applet.Applet
{
  public void init() {
    image = getImage(getCodeBase(),
                     "image.gif");
    getBuffer();

    addMouseMotionListener(
        new MouseMotionAdapter() {
            public void mouseDragged(
                          MouseEvent me) {
              point = new Point(me.getX(),
                                me.getY());
              repaint();
            }
        }
    );
  }

  public void update(Graphics g) {
    updateBuffer();
    paint(g);
  }

  public void paint(Graphics g) {
    if (!getSize().equals(bufferSize))
        getBuffer();
    g.drawImage(bufferImage, 0, 0, this);
  }

  private void getBuffer() {
    if (bufferImage != null) {
        bufferImage.flush();
        bufferImage = null;
    }
    bufferSize = getSize();
    bufferImage = createImage(bufferSize.width,
                            bufferSize.height);
    updateBuffer();
  }

  private void updateBuffer() {
    Graphics buffer = bufferImage.getGraphics();
    buffer.clearRect(0, 0, bufferSize.width,
                           bufferSize.height);
    if (point != null)
        buffer.drawImage(image, point.x,
                                point.y, this);
  }

  private Point point;       // where to draw
  private Image image;       // what to draw
  private Image bufferImage; // what to draw on
  private Dimension bufferSize;
}

[Previous Lecture] [Lecture Index] [Next Lecture]