# 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
JTable Examples
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); } }
Aug 26
Adds typing to the freehand drawing.
import java.applet.Applet; import java.awt.*; import java.awt.event.*; /** A better whiteboard that lets you enter * text in addition to freehand drawing. * ****************** public class Whiteboard extends SimpleWhiteboard { protected FontMetrics fm; public void init() { super.init(); Font font = new Font("Serif", Font.BOLD, 20); setFont(font); fm = getFontMetrics(font); addKeyListener(new CharDrawer()); } private class CharDrawer extends KeyAdapter { // When user types a printable character, // draw it and shift position rightwards. public void keyTyped(KeyEvent event) { String s = String.valueOf(event.getKeyChar()); getGraphics().drawString(s, lastX, lastY); record(lastX + fm.stringWidth(s), lastY); } } }
Aug 26
java Nested container where the top-level panels are positioned by hand
###################### ButtonCol.java Nested container where the top-level panels are positioned by hand ###################### import java.applet.Applet; import java.awt.*; /** An example of a layout performed manually. The top-level * panels are positioned by hand, after you determine the size * of the applet. Since applets can't be resized in most * browsers, setting the size once when the applet is created * is sufficient. * *************************** public class ButtonCol extends Applet { public void init() { setLayout(null); int width1 = getSize().width*4/10, width2 = getSize().width - width1, height = getSize().height; Panel buttonPanel = new Panel(); buttonPanel.setBounds(0, 0, width1, height); buttonPanel.setLayout(new GridLayout(6, 1)); buttonPanel.add(new Label("Buttons", Label.CENTER)); buttonPanel.add(new Button("Button One")); buttonPanel.add(new Button("Button Two")); buttonPanel.add(new Button("Button Three")); buttonPanel.add(new Button("Button Four")); buttonPanel.add(new Button("Button Five")); add(buttonPanel); Panel everythingElse = new Panel(); everythingElse.setBounds(width1+1, 0, width2, height); everythingElse.add(new Label("Everything Else")); add(everythingElse); } }