import java.awt.*;
import javax.swing.*;
/** Tiny example showing the main differences in using
* JApplet instead of Applet: using the content pane,
* getting Java (Metal) look and feel by default, and
* having BorderLayout be the default instead of FlowLayout.
*
*/
public class JAppletExample extends JApplet {
public void init() {
WindowUtilities.setNativeLookAndFeel();
Container content = getContentPane();
content.setBackground(Color.white);
content.setLayout(new FlowLayout());
content.add(new JButton("Button 1"));
content.add(new JButton("Button 2"));
content.add(new JButton("Button 3"));
}
}
Aug 26
A simple applet (JApplet) created in Swing.
Aug 26
Illustrates the insertion of menu entries in Frame menu bars.
**************
ColorMenu.java
**************
import java.awt.*;
import java.awt.event.*;
/** Illustrates the insertion of menu entries in Frame
* menu bars.
*
public class ColorMenu extends CloseableFrame
implements ActionListener {
private String[] colorNames =
{ "Black", "White", "Light Gray", "Medium Gray",
"Dark Gray" };
private Color[] colorValues =
{ Color.black, Color.white, Color.lightGray,
Color.gray, Color.darkGray };
public ColorMenu() {
super("ColorMenu");
MenuBar bar = new MenuBar();
Menu colorMenu = new Menu("Colors");
for(int i=0; i<2; i++) {
colorMenu.add(colorNames[i]);
}
Menu grayMenu = new Menu("Gray");
for(int i=2; i
Aug 26
JTable Examples
# JTableSimpleExample.java Simple table that takes column names and data from arrays of Strings.
import java.awt.*;
import javax.swing.*;
/** Simple JTable example that uses a String array for the
* table header and table data.
*
*/
public class JTableSimpleExample extends JFrame {
public static void main(String[] args) {
new JTableSimpleExample();
}
private final int COLUMNS = 4;
private final int ROWS = 15;
private JTable sampleJTable;
public JTableSimpleExample() {
super("Creating a Simple JTable");
WindowUtilities.setNativeLookAndFeel();
addWindowListener(new ExitListener());
Container content = getContentPane();
String[] columnNames = buildColumnNames(COLUMNS);
String[][] tableCells = buildTableCells(ROWS, COLUMNS);
sampleJTable = new JTable(tableCells, columnNames);
JScrollPane tablePane = new JScrollPane(sampleJTable);
content.add(tablePane, BorderLayout.CENTER);
setSize(450,150);
setVisible(true);
}
private String[] buildColumnNames(int columns) {
String[] header = new String[columns];
for(int i=0; i
Aug 26
Eight buttons: four each in two panels
mport java.applet.Applet; import java.awt.*;
***************************
/** Eight buttons: four each in two panels. * */
public class ButtonTest2 extends Applet {
public void init() {
String[] labelPrefixes = {
"Start", "Stop", "Pause", "Resume"
};
Panel p1 = new Panel(); for (int i=0; i<4; i++) {
p1.add(new Button(labelPrefixes[i] + " Thread1"));
}
Panel p2 = new Panel(); for (int i=0; i<4; i++) {
p2.add(new Button(labelPrefixes[i] + " Thread2"));
} add(p1); add(p2);
}
}
**************************
Aug 26
JList Examples
All examples, except for FileTransfer use WindowUtilities.java and ExitListener.java.
WindowUtilities.java:
import javax.swing.*;
import java.awt.*; // For Color and Container classes.
/** A few utilities that simplify using windows in Swing.
*
*/
public class WindowUtilities {
/** Tell system to use native look and feel, as in previous
* releases. Metal (Java) LAF is the default otherwise.
*/
public static void setNativeLookAndFeel() {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) {
System.out.println("Error setting native LAF: " + e);
}
}
public static void setJavaLookAndFeel() {
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
} catch(Exception e) {
System.out.println("Error setting Java LAF: " + e);
}
}
public static void setMotifLookAndFeel() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel");
} catch(Exception e) {
System.out.println("Error setting Motif LAF: " + e);
}
}
/** A simplified way to see a JPanel or other Container. Pops
* up a JFrame with specified Container as the content pane.
*/
public static JFrame openInJFrame(Container content,
int width,
int height,
String title,
Color bgColor) {
JFrame frame = new JFrame(title);
frame.setBackground(bgColor);
content.setBackground(bgColor);
frame.setSize(width, height);
frame.setContentPane(content);
frame.addWindowListener(new ExitListener());
frame.setVisible(true);
return(frame);
}
/** Uses Color.white as the background color. */
public static JFrame openInJFrame(Container content,
int width,
int height,
String title) {
return(openInJFrame(content, width, height,
title, Color.white));
}
/** Uses Color.white as the background color, and the
* name of the Container's class as the JFrame title.
*/
public static JFrame openInJFrame(Container content,
int width,
int height) {
return(openInJFrame(content, width, height,
content.getClass().getName(),
Color.white));
}
}
**//
ExitListener.java.:
import java.awt.*;
import java.awt.event.*;
/** A listener that you attach to the top-level JFrame of
* your application, so that quitting the frame exits the
* application.
*
*/
public class ExitListener extends WindowAdapter {
public void windowClosing(WindowEvent event) {
System.exit(0);
}
}
**//
JList Examples
* JListSimpleExample.java Illustrates creating a simple list. In this example, all the entries for the list are stored in a String array and later supplied in the JList constructor. In addition, a private class, ValueReporter, implements a ListSelectionListener to display the last entry in the list selected by the user.
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
/** Simple JList example illustrating
*
*
Creating a JList, which we do by passing values
* directly to the JList constructor, rather than
* using a ListModel, and
*
Attaching a listener to determine when values change.
*
*/
public class JListSimpleExample extends JFrame {
public static void main(String[] args) {
new JListSimpleExample();
}
private JList sampleJList;
private JTextField valueField;
public JListSimpleExample() {
super("Creating a Simple JList");
WindowUtilities.setNativeLookAndFeel();
addWindowListener(new ExitListener());
Container content = getContentPane();
// Create the JList, set the number of visible rows, add a
// listener, and put it in a JScrollPane.
String[] entries = { "Entry 1", "Entry 2", "Entry 3",
"Entry 4", "Entry 5", "Entry 6" };
sampleJList = new JList(entries);
sampleJList.setVisibleRowCount(4);
sampleJList.addListSelectionListener(new ValueReporter());
JScrollPane listPane = new JScrollPane(sampleJList);
Font displayFont = new Font("Serif", Font.BOLD, 18);
sampleJList.setFont(displayFont);
JPanel listPanel = new JPanel();
listPanel.setBackground(Color.white);
Border listPanelBorder =
BorderFactory.createTitledBorder("Sample JList");
listPanel.setBorder(listPanelBorder);
listPanel.add(listPane);
content.add(listPanel, BorderLayout.CENTER);
JLabel valueLabel = new JLabel("Last Selection:");
valueLabel.setFont(displayFont);
valueField = new JTextField("None", 7);
valueField.setFont(displayFont);
valueField.setEditable(false);
JPanel valuePanel = new JPanel();
valuePanel.setBackground(Color.white);
Border valuePanelBorder =
BorderFactory.createTitledBorder("JList Selection");
valuePanel.setBorder(valuePanelBorder);
valuePanel.add(valueLabel);
valuePanel.add(valueField);
content.add(valuePanel, BorderLayout.SOUTH);
pack();
setVisible(true);
}
private class ValueReporter implements ListSelectionListener {
/** You get three events in many cases -- one for the
* deselection of the originally selected entry, one
* indicating the selection is moving, and one for the
* selection of the new entry. In the first two cases,
* getValueIsAdjusting returns true; thus, the test below
* when only the third case is of interest.
*/
public void valueChanged(ListSelectionEvent event) {
if (!event.getValueIsAdjusting()) {
Object value = sampleJList.getSelectedValue();
if (value != null) {
valueField.setText(value.toString());
}
}
}
}
}
**//
DefaultListModelExample.java Creates a list using a DefaultListModel. By default, a JList doesn’t permit you to directly add new entries; however, with the DefaultListModel you can add or delete entries to the model (which are reflected in the list).
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
/** JList example illustrating
*
*
The creation of a JList by creating a DefaultListModel,
* adding the values there, then passing that to the
* JList constructor.
*
Adding new values at runtime, the key thing that
* DefaultListModel lets you do that you can't do with
* a JList where you supply values directly.
*
*
*/
public class DefaultListModelExample extends JFrame {
public static void main(String[] args) {
new DefaultListModelExample();
}
JList sampleJList;
private DefaultListModel sampleModel;
public DefaultListModelExample() {
super("Creating a Simple JList");
WindowUtilities.setNativeLookAndFeel();
addWindowListener(new ExitListener());
Container content = getContentPane();
String[] entries = { "Entry 1", "Entry 2", "Entry 3",
"Entry 4", "Entry 5", "Entry 6" };
sampleModel = new DefaultListModel();
for(int i=0; ibefore trying to scroll
* to make the index visible.
*/
public void actionPerformed(ActionEvent event) {
int index = sampleModel.getSize();
sampleModel.addElement("Entry " + (index+1));
((JComponent)getContentPane()).revalidate();
sampleJList.setSelectedIndex(index);
sampleJList.ensureIndexIsVisible(index);
}
}
}
**//
# JListCustomModel.java Example illustrating that you can use your own custom data model (data structure) to hold the entries in a list. Uses the following classes:
* JavaLocationListModel.java A custom list model (implements ListModel interface which provides support for custom data structures) to store data for the list.
* JavaLocationCollection.java A simple collection of JavaLocation (below) objects.
* JavaLocation.java An object representing a city named Java. Defines the country where the Java city is located, along with a comment and country flag (gif image).
JListCustomModel.java:
import java.awt.*;
import javax.swing.*;
/** Simple JList example illustrating the use of a custom
* ListModel (JavaLocationListModel).
*
*/
public class JListCustomModel extends JFrame {
public static void main(String[] args) {
new JListCustomModel();
}
public JListCustomModel() {
super("JList with a Custom Data Model");
WindowUtilities.setNativeLookAndFeel();
addWindowListener(new ExitListener());
Container content = getContentPane();
JavaLocationCollection collection =
new JavaLocationCollection();
JavaLocationListModel listModel =
new JavaLocationListModel(collection);
JList sampleJList = new JList(listModel);
Font displayFont = new Font("Serif", Font.BOLD, 18);
sampleJList.setFont(displayFont);
content.add(sampleJList);
pack();
setVisible(true);
}
}
**//
# JavaLocationListModel.java:
import javax.swing.*;
import javax.swing.event.*;
/** A simple illustration of writing your own ListModel.
* Note that if you wanted the user to be able to add and
* remove data elements at runtime, you should start with
* AbstractListModel and handle the event reporting part.
*
*/
public class JavaLocationListModel implements ListModel {
private JavaLocationCollection collection;
public JavaLocationListModel(JavaLocationCollection collection) {
this.collection = collection;
}
public Object getElementAt(int index) {
return(collection.getLocations()[index]);
}
public int getSize() {
return(collection.getLocations().length);
}
public void addListDataListener(ListDataListener l) {}
public void removeListDataListener(ListDataListener l) {}
}
**//
JavaLocationCollection.java:
/** A simple collection that stores multiple JavaLocation
* objects in an array and determines the number of
* unique countries represented in the data.
*
*/
public class JavaLocationCollection {
private static JavaLocation[] defaultLocations =
{ new JavaLocation("Belgium",
"near Liege",
"flags/belgium.gif"),
new JavaLocation("Brazil",
"near Salvador",
"flags/brazil.gif"),
new JavaLocation("Colombia",
"near Bogota",
"flags/colombia.gif"),
new JavaLocation("Indonesia",
"main island",
"flags/indonesia.gif"),
new JavaLocation("Jamaica",
"near Spanish Town",
"flags/jamaica.gif"),
new JavaLocation("Mozambique",
"near Sofala",
"flags/mozambique.gif"),
new JavaLocation("Philippines",
"near Quezon City",
"flags/philippines.gif"),
new JavaLocation("Sao Tome",
"near Santa Cruz",
"flags/saotome.gif"),
new JavaLocation("Spain",
"near Viana de Bolo",
"flags/spain.gif"),
new JavaLocation("Suriname",
"near Paramibo",
"flags/suriname.gif"),
new JavaLocation("United States",
"near Montgomery, Alabama",
"flags/usa.gif"),
new JavaLocation("United States",
"near Needles, California",
"flags/usa.gif"),
new JavaLocation("United States",
"near Dallas, Texas",
"flags/usa.gif")
};
private JavaLocation[] locations;
private int numCountries;
public JavaLocationCollection(JavaLocation[] locations) {
this.locations = locations;
this.numCountries = countCountries(locations);
}
public JavaLocationCollection() {
this(defaultLocations);
}
public JavaLocation[] getLocations() {
return(locations);
}
public int getNumCountries() {
return(numCountries);
}
// Count the number of unique countries in the data.
// Assumes the list is sorted by country name
private int countCountries(JavaLocation[] locations) {
int n = 0;
String currentCountry, previousCountry = "None";
for(int i=0;i
* Note that this method can get called lots and lots of times
* as you click on entries. We don't want to keep generating
* new ImageIcon objects, so we make a Hashtable that associates
* previously displayed values with icons, reusing icons for
* entries that have been displayed already.
*
* Note that in the first release of JDK 1.2, the default
* renderer has a bug: the renderer doesn't clear out icons for
* later entries. So if you mix plain strings and ImageIcons in
* your JList, the plain strings still get an icon. The
* call below clears the old icon when the value is not a
* JavaLocation.
*
*/
public class JavaLocationRenderer extends
DefaultListCellRenderer {
private Hashtable iconTable = new Hashtable();
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean hasFocus) {
// First build the label containing the text, then
// later add the image.
JLabel label =
(JLabel)super.getListCellRendererComponent(list,
value,
index,
isSelected,
hasFocus);
if (value instanceof JavaLocation) {
JavaLocation location = (JavaLocation)value;
ImageIcon icon = (ImageIcon)iconTable.get(value);
if (icon == null) {
icon = new ImageIcon(location.getFlagFile());
iconTable.put(value, icon);
}
label.setIcon(icon);
} else {
// Clear old icon; needed in 1st release of JDK 1.2.
label.setIcon(null);
}
return(label);
}
}
**//
# JavaLocationListModel.java A custom list model (implements ListModel interface) to store data for a list.
# JavaLocationCollection.java A simple collection of JavaLocation (below) objects.
# JavaLocation.java An object representing a city named Java. Defines the country where the Java
city is located, along with a comment and country flag
Aug 26
Position circles down the diagonal so that their borders
import java.awt.*;
import java.applet.Applet;
/** Position circles down the diagonal so that their borders
* just touch. Illustrates that AWT components are
* rectangular and opaque.
*/
public class CircleTest2 extends Applet {
public void init() {
setBackground(Color.lightGray);
setLayout(null); // Turn off layout manager.
Circle circle;
int radius = getSize().width/6;
int deltaX = round(2.0 * (double)radius / Math.sqrt(2.0));
for (int x=radius; x<6*radius; x=x+deltaX) {
circle = new Circle(Color.black, radius);
add(circle);
circle.setCenter(x, x);
}
}
private int round(double num) {
return((int)Math.round(num));
}
}
*********************************
Circle.java
*********************************
import java.awt.*;
/** A Circle component built using a Canvas.
*
*/
public class Circle extends Canvas {
private int width, height;
public Circle(Color foreground, int radius) {
setForeground(foreground);
width = 2*radius;
height = 2*radius;
setSize(width, height);
}
public void paint(Graphics g) {
g.fillOval(0, 0, width, height);
}
public void setCenter(int x, int y) {
setLocation(x - width/2, y - height/2);
}
}
*****************************
Aug 26
Insert three circles into an Applet using FlowLayout
import java.awt.*;
import java.applet.Applet;
/** Insert three circles into an Applet using FlowLayout.
*
*/
public class CircleTest extends Applet {
public void init() {
setBackground(Color.lightGray);
add(new Circle(Color.white, 30));
add(new Circle(Color.gray, 40));
add(new Circle(Color.black, 50));
}
}
Aug 26
Message.java Applet that reads customization parameters from an HTML file
*******************
Message.java Applet that reads customization parameters from an HTML file
*******************
import java.applet.Applet;
import java.awt.*;
****************
public class Message extends Applet {
private int fontSize;
private String message;
public void init() {
setBackground(Color.black);
setForeground(Color.white);
// Base font size on window height.
fontSize = getSize().height - 10;
setFont(new Font("SansSerif", Font.BOLD, fontSize));
// Read heading message from PARAM entry in HTML.
message = getParameter("MESSAGE");
}
public void paint(Graphics g) {
if (message != null) {
g.drawString(message, 5, fontSize+5);
}
}
}
*******************
Aug 26
Accesses methods in a Ship2 object
*********************************************
Test2.java Accesses methods in a Ship2 object
*********************************************
// Give the ship public move and printLocation methods.
class Ship2 {
public double x=0.0, y=0.0, speed=1.0, direction=0.0;
public String name = "UnnamedShip";
private double degreesToRadians(double degrees) {
return(degrees * Math.PI / 180.0);
}
public void move() {
double angle = degreesToRadians(direction);
x = x + speed * Math.cos(angle);
y = y + speed * Math.sin(angle);
}
public void printLocation() {
System.out.println(name + " is at " +
"(" + x + "," + y + ").");
}
}
public class Test2 {
public static void main(String[] args) {
Ship2 s1 = new Ship2();
s1.name = "Ship1";
Ship2 s2 = new Ship2();
s2.direction = 135.0; // Northwest
s2.speed = 2.0;
s2.name = "Ship2";
s1.move();
s2.move();
s1.printLocation();
s2.printLocation();
}
}
**********************
Aug 26
Placement of buttons in a BoxLayout using rigid areas, struts, and glue
###############
InvisibleComponentTest.java Placement of buttons in a BoxLayout using rigid areas, struts, and glue
###############
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
/** Example of using rigid areas, struts, and glue to
* produce the effect of invisible components.
*
******************
public class InvisibleComponentTest extends JPanel {
Component spacer;
public InvisibleComponentTest() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
// Place a rigid invisible component 25 pixels wide and
// 75 pixels tall between the two buttons
JPanel p1= new JPanel();
spacer = Box.createRigidArea(new Dimension(20,75));
setUpPanel(p1, "Rigid Area - 20x75 pixels", spacer);
// Separate two buttons by a 60-pixel horizontal strut
JPanel p2= new JPanel();
spacer = Box.createHorizontalStrut(60);
setUpPanel(p2, "Horizontal Strut - 60 pixels", spacer);
// Horizontal glue in FlowLayout - not useful
JPanel p3= new JPanel();
spacer = Box.createHorizontalGlue();
setUpPanel(p3, "Horizontal Glue - FlowLayout", spacer);
// Add glue to fill all remaining horizontal space between
// the two buttons. Glue not supported by default FlowLayout
// of JPanel. Change layout of JPanel to BoxLayout.
JPanel p4= new JPanel();
p4.setLayout(new BoxLayout(p4,BoxLayout.X_AXIS));
spacer = Box.createHorizontalGlue();
setUpPanel(p4, "Horizontal Glue - BoxLayout", spacer);
add(p1);
add(p2);
add(p3);
add(p4);
}
// Helper to set the border and add components
private void setUpPanel(JPanel p, String title,
Component spacer) {
p.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(),title,
TitledBorder.TOP,TitledBorder.CENTER));
p.setBackground(Color.white);
p.add(new JButton("Left"));
p.add(spacer);
p.add(new JButton("Right"));
}
public static void main(String[] args) {
String title = "Using Invisible Components";
WindowUtilities.setNativeLookAndFeel();
WindowUtilities.openInJFrame(new InvisibleComponentTest(),
350, 325, title);
}
}
