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]