Now that we have seen some of the other components that are available and we have also seen quite a complex event structure for these components an example should help clear up any confusion.
Task: Write the application as shown in Figure 9.18, “A Scrollbar Example Applet” where the
Scrollbar
component updates the text in the TextField
component when it
is moved. The Reset Button
component should set the value of the
TextField
object to 0. The Scrollbar
component should have the
range 0 to 100.
Solution: You can see this Scrollbar example applet running here -
ScrollbarExample.html
and the
code segment is here - ScrollbarExample.java
1 2 // A Scrollbar Event Applet 3 4 import java.applet.*; 5 import java.awt.*; 6 import java.awt.event.*; 7 8 public class ScrollbarExample extends Applet implements AdjustmentListener, 9 ActionListener 10 { 11 12 private Scrollbar scrollbar; 13 private TextField status; 14 private Button resetButton; 15 16 public void init() 17 { 18 this.setLayout(new GridLayout(2,1)); 19 Panel topPanel = new Panel(); 20 21 this.status = new TextField(20); 22 this.scrollbar = new Scrollbar(Scrollbar.HORIZONTAL, 50, 10, 23 0, 110); 24 this.resetButton = new Button("Reset"); 25 26 this.resetButton.addActionListener(this); 27 this.scrollbar.addAdjustmentListener(this); 28 29 topPanel.add(status); 30 topPanel.add(resetButton); 31 32 this.add(topPanel); 33 this.add(scrollbar); 34 35 this.updateText(); 36 } 37 38 public void actionPerformed(ActionEvent e) 39 { 40 if (e.getActionCommand().equals("Reset")) 41 { 42 this.scrollbar.setValue(0); 43 this.updateText(); 44 } 45 } 46 47 public void adjustmentValueChanged(AdjustmentEvent e) 48 { 49 if (e.getSource().equals(scrollbar)) 50 { 51 this.updateText(); 52 } 53 } 54 55 private void updateText() 56 { 57 status.setText("Scroll Value = " + scrollbar.getValue()); 58 } 59 } 60
To complete this application there are a few points to note:
The ScrollbarExample
class implements both the AdjustmentListener
and the ActionListener
interfaces. A class can implement as many interfaces as
desired. To implement both these interfaces an adjustmentValueChanged()
method and an
actionPerformed()
method both had to be written, otherwise the code would not compile.
I wrote a private method updateText()
that updates the status
state. I did this as otherwise there would be three different status.setText()
calls,
replicating code and leading to unpredictable results if two were changed and one was not.
For the layout I used a 2x1 (i.e. 2 rows, 1 column) GridLayout
with a panel (topPanel
) in
the top grid section and the scrollbar
object in the bottom grid section. To the
topPanel
container I added the status
TextField
object and
the resetButton
Button
object. Since the default layout for a
Panel
object is FlowLayout
the components added are given their
preferred size. Note that because the scrollbar
object was added directly to the grid section
it is bound to the grid size and will change size as the applet changes size.
I have called this.updateText()
in the init()
method so that the status
TextField
component will display the
initial value of the scrollbar
object.
Note that in the constructor call to Scrollbar
the range was set from
0 to 110. We were required by the task to allow a value to be chosen from 0 to 100. We set the maximum at
110 as the width of the bubble is 10 and the value selected is taken from the start of the bubble. So the
maximum range value is always the value desired plus the width of the bubble. Note that when you run this
applet (alternatively see Figure 9.18, “A Scrollbar Example Applet”) you can press on the "arrows" at the left
and right of the Scrollbar
component and the value will increment/decrement by 1. If
you press on the area between the bubble and the arrows then the value will increment/decrement by 10 - the
width of the bubble.
Task: Write an applet that allows you to choose a system font to allow you to
test how it will look. The applet should look like Figure 9.19, “The FontChooser Applet Exercise” where the
Choice
component allows you to select the font, the Scrollbar
component allows you to choose the size and the List
allows you to style of the
font. The font should be displayed on the left using a Label
component. You can see this applet
running at FontChooserApplet.html
.
Hints: I have not shown you how to work with Font
objects before,
but it is relatively straightforward for this applet. We will need to use Java's logical fonts for this applet as
the component we use to display the text is likely a Label
object and this does not support
fonts other than logical fonts, such as physical fonts. So to create a font object use:
Font f = new Font(String name, int style, int size)
Where the name is one of "Serif", "SansSerif", "Monospaced", "Dialog", "DialogInput" strings. The style is one of
Font.REGULAR
, Font.BOLD
, Font.ITALIC
or the sum of any
of these (e.g. Font.BOLD
+ Font.ITALIC
as they are int values).
The size is simply an int from 1 to 100 in my case. So to set the font of a Label
object we could type something like:
1 2 Label myLabel; 3 Font f = new Font("SansSerif", Font.BOLD + Font.ITALIC, 12); 4 myLabel.setFont(f); 5
Solution: Do not look at the solution until you have had a good attempt at coding
it yourself. If you get stuck look at my solution at:
FontChooserApplet.java
.
Advanced Note: If you need to use fonts other than the logical fonts again. You can get the list of fonts available to you by using:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] fonts = ge.getAvailableFontFamilyNames();
It will not work in this case as a Label
component can only have logical font types.
© 2006
Dr. Derek Molloy
(DCU).