TheSimpleapplet's display code (implemented in itspaintmethod) is flawed: It doesn't support scrolling. Once the text it displays reaches the end of the display rectangle, you can't see any new text. Here's an example of the problem:
This figure has been reduced to fit on the page.
Click the image to view it at its natural size.The simplest cure for this problem is to use a pre-made user interface (UI) component that has the right behavior.
Note: This page glosses over many details. To really learn about using UI components, go to Creating a GUI with JFC/Swing.
Swing supplies the following UI components (the class that implements each component is listed in parentheses):
- Buttons (
javax.swing.JButton)- Checkboxes (
javax.swing.JCheckBox)- Single-line text fields (
javax.swing.JTextField)- Larger text display and editing areas (
javax.swing.JTextArea)- Labels (
javax.swing.JLabel)- Lists (
javax.swing.JList)- Pop-ups (
javax.swing.Popup)- Scrollbars (
javax.swing.JScrollBar)- Sliders (
javax.swing.JSlider)- Drawing areas (
java.awt.Canvas)- Menus (
javax.swing.JMenu,javax.swing.JMenuBarjavax.swing.JMenuItem,javax.swing.JCheckBoxMenuItem)- Containers (
javax.swing.JPanel,javax.swing.JWindowand its subclasses)
Because theJAppletclass inherits from the AWTContainerclass, it's easy to add components to applets and to use layout managers to control the components' onscreen positions. Here are some of theContainermethods an applet can use:
add- Adds the specified
Component.remove- Removes the specified
Component.setLayout- Sets the layout manager.
Simple AppletTo make theSimpleapplet use a scrolling, non-editable text field, we can use theJTextFieldclass. Here is the revisedScrollingSimple class./* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Java(TM) SE 6 version. */ import javax.swing.JApplet; import javax.swing.JTextField; import javax.swing.SwingUtilities; //Since we're adding a Swing component, we now need to //extend JApplet. We need to be careful to access //components only on the event-dispatching thread. public class ScrollingSimple extends JApplet { JTextField field; public void init() { //Execute a job on the event-dispatching thread: //creating this applet's GUI. try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } addItem(false, "initializing... "); } private void createGUI() { //Create the text field and make it uneditable. field = new JTextField(); field.setEditable(false); //Set the layout manager so that the text field will be //as wide as possible. setLayout(new java.awt.GridLayout(1,0)); //Add the text field to the applet. add(field); } public void start() { addItem(false, "starting... "); } public void stop() { addItem(false, "stopping... "); } public void destroy() { addItem(false, "preparing for unloading..."); cleanUp(); } private void cleanUp() { //Execute a job on the event-dispatching thread: //taking the text field out of this applet. try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { remove(field); } }); } catch (Exception e) { System.err.println("cleanUp didn't successfully complete"); } field = null; } private void addItem(boolean alreadyInEDT, String newWord) { if (alreadyInEDT) { addItem(newWord); } else { final String word = newWord; //Execute a job on the event-dispatching thread: //invoking addItem(newWord). try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { addItem(word); } }); } catch (Exception e) { System.err.println("addItem didn't successfully complete"); } } } //Invoke this method ONLY from the event-dispatching thread. private void addItem(String newWord) { String t = field.getText(); System.out.println(newWord); field.setText(t + newWord); } }The
createGUImethod creates an uneditable text field (aJTextFieldinstance). It sets the applet's layout manager to one that makes the text field as wide as possible (you'll learn about layout managers in Laying Out Components within a Container) and then adds the text field to the applet.Below is the resulting applet.
Note: If you don't see the applet running above, you need to install Java Plug-in, which happens automatically when you install the Java(TM) SE JRE or JDK. This applet requires JDK 1.4 or later. You can find more information on the Java Plug-in home page.