Easy to Learn Java: Programming Articles, Examples and Tips

Start with Java in a few days with Java Lessons or Lectures

Home

Code Examples

Java Tools

More Java Tools!

Java Forum

All Java Tips

Books

Submit News
Search the site here...
Search...
 
Search the JavaFAQ.nu
1000 Java Tips ebook

1000 Java Tips - Click here for the high resolution copy!1000 Java Tips - Click here for the high resolution copy!

Java Screensaver, take it here

Free "1000 Java Tips" eBook is here! It is huge collection of big and small Java programming articles and tips. Please take your copy here.

Take your copy of free "Java Technology Screensaver"!.

Easy Learn Java: Programming Articles, Examples and Tips - Page 490


Previous 1060 Stories (530 Pages, 2 Per Page) Next

Easy Java Lecture 15-2: Swing I. Handling events in Swing application: theory, e

Go to all tips in Java Lectures by Anatoliy Malyarenko

Handling events

What is event-driven programming? Java Event Handling: event types, registering for events; event objects; listener methods and adapters.

Every time the user types a character or pushes a mouse button, an event occurs. Any object can be notified of the event. All the object has to do is implement the appropriate interface and be registered as an event listener on the appropriate event source.

Every event handler requires three pieces of code:


  1. In the declaration for the event handler class, one line of code specifies that the class either implements a listener interface or extends a class that implements a listener interface. For example:

    Code:

    public class MyClass implements ActionListener {

  2. Another line of code registers an instance of the event handler class as a listener on one or more components. For example:

    Code:

    someComponent.addActionListener(instanceOfMyClass);
  3. In the event handler class, a few lines of code implement the methods in the listener interface. For example:

    Code:

    public void actionPerformed(ActionEvent e) {<br />
         ...//code that reacts to the action...<br />
    }

Event handlers can be instances of any class. Often an event handler that has only a few lines of code is implemented using an anonymous inner class -- an unnamed class defined inside of another class. Anonymous inner classes can be confusing at first, but once you're used to them, they make the code clearer by keeping the implementation of an event handler close to where the event handler is registered.

SwingApplication has two event handlers. One handles window closing (window events); the other handles button clicks (action events). We've already seen the window- closing code. Here is the code that handles button clicks in the SwingApplication:

Code:


button.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
      numClicks++;
      label.setText(labelPrefix + numClicks);
   }
});

In general, to detect when the user clicks an on-screen button (or does the keyboard equivalent), a program must have an object that implements the ActionListener interface. The program must register this object as an action listener on the button (the event source), using the addActionListener method. When the user clicks the on-screen button, the button fires an action event. This results in the invocation of the action listener's actionPerformed method (the only method in the ActionListener interface). The single argument to the method is an ActionEvent object that gives information about the event and its source.

Swing components can generate many kinds of events. The following table lists a few examples.

Examples of events and their associated event listeners
Act that results in the event Listener type
User clicks a button, presses Return while typing in a text field, or chooses a menu item ActionListener
User closes a frame (main window) WindowListener
User presses a mouse button while the cursor is over a component MouseListener
User moves the mouse over a component MouseMotionListener
Component becomes visible ComponentListener
Component gets the keyboard focus FocusListener
Table or list selection changes ListSelectionListener

Adding borders around components

If you take another look at the snapshot of SwingApplication, you'll notice that there is extra space surrounding the JPanel on all four edges.

Here is the code that adds a border to the panel:

Code:
 
pane.setBorder(BorderFactory.createEmptyBorder(
            30, //top
            30, //left
            10, //bottom
            30) //right
  );

This border simply provides some empty space around the panel's contents -- 30 extra pixels on the top, left, and right, and 10 extra pixels on the bottom. Borders are a feature that JPanel inherits from the JComponent class.

Example three: CelsiusConverter

Our next example, CelsiusConverter, does something that's somewhat useful: It is a simple conversion tool. The user enters a temperature in degrees Celsius and clicks the Convert... button, and a label displays the equivalent in degrees Fahrenheit.

Let's examine the code to see how CelsiusConverter parses the number entered in the JTextField. First, here's the code that sets up the JTextField:

Code:

JTextField tempCelsius = null;
...
tempCelsius = new JTextField(5);

The integer argument passed in the JTextField constructor, 5 in the example, indicates the number of columns in the field. This number is used along with metrics provided by the current font to calculate the field's preferred width. This number does not limit how many character the user can enter.

We want to handle the button-click event, so we add an event listener to the button.

Code:


JButton convertTemp;
...
convertTemp.addActionListener(this);
...
public void actionPerformed(ActionEvent event) {
   // Parse degrees Celsius as a double and convert to Fahrenheit.
   int tempFahr=(int)((Double.parseDouble(
                              tempCelsius.getText())) * 1.8 + 32);
   fahrenheitLabel.setText(tempFahr + " Fahrenheit");
}

The getText method is called on the text field, tempCelsius, to retrieve the data within it. Next, the parseDouble method parses the text as a double before converting the temperature and casting the result to an integer. Finally, the setText method is called on the fahrenheitLabel to display the converted temperature. All this code is found in the event handler for the button, as the conversion happens only once the button is clicked.

You can make a JButton be the default button. At most one button in a top-level container can be the default button. The default button typically has a highlighted appearance and acts clicked whenever the top-level container has the keyboard focus and the user presses the Return or Enter key. The exact implementation depends on the look and feel. You set the default button by invoking the setDefaultButton method on a top-level container's root pane:

//In the constructor for a JDialog subclass:

Code:

getRootPane().setDefaultButton(setButton);

Adding HTML

You can use HTML to specify the text on some Swing components, such as buttons and labels. We can spice up the CelsiusConverter program by adding HTML text to the fahrenheitLabel and adding an image to the convertTemp button. The revised program is CelsiusConverter2.


First, let's look at how we specify the HTML tags for the fahrenheitLabel. As you can see from this code, the temperature (tempFahr) is displayed one of three different colours, depending on how hot or cold the converted temperature is:

Code:


// Set fahrenheitLabel to new value and font colour based
// on temperature.
if (tempFahr <= 32) {
   fahrenheitLabel.setText("<html><font color=blue>"
                              + tempFahr
                  + "° Fahrenheit </font></html>");
} else if (tempFahr <= 80) {
   fahrenheitLabel.setText("<html><font color=green>"
                              + tempFahr
                  + "° Fahrenheit </font></html>");
} else {
   fahrenheitLabel.setText("<html><font color=red>"
                              + tempFahr
                  + "° Fahrenheit </font></html>");
}

To add HTML code to the label, simply put the ¡HTML¿ tag at the beginning of a string, and then use any valid HTML code in the remainder of the string. Using HTML can be useful for varying the text font or colour within a button and for adding line breaks. To display the degree symbol, we use the HTML code &#176.

If the string is to be all one size and colour, you don't have to use HTML. You can call the setFont method to specify the font of any component.

Adding an icon

Some Swing components can be decorated with an icon -- a fixed-size image. A Swing icon is an object that adheres to the Icon interface. Swing provides a particularly useful implementation of the Icon interface: ImageIcon. ImageIcon paints an icon from a GIF or a JPEG image. Here's the code that adds the arrow graphic to the convertTemp button:

Code:

ImageIcon icon = new ImageIcon("images/convert.gif",
                     "Convert temperature");
...
convertTemp = new JButton(icon);

The first argument of the ImageIcon constructor specifies the file to load, relative to the directory containing the application's class file. The second argument provides a description of the icon that assistive technologies can use.


10216 bytes more | comments? | Printer Friendly Page  Send to a Friend | Score: 0
Posted by jalex on Thursday, January 11, 2007 (20:00:00) (5284 reads)

Easy Java Lecture 15: Swing I. Part I. Teach/learn online

Go to all tips in Java Lectures by Anatoliy Malyarenko

Swing I

Abstract

  • Contents of the lecture.
  • Overview of the Swing API.
  • Your first Swing program.
  • Example two: SwingApplication.
  • Example three: CelsiusConverter.

Overview of the Swing API

The Swing package is part of the JavaTM+ Foundation Classes (JFC) in the Java platform. The JFC encompasses a group of features to help people build GUIs; Swing provides all the components from buttons to split panes and tables.

The Swing package was first available as an add-on to JDK 1.1. Prior to the introduction of the Swing package, the Abstract Window Toolkit (AWT) components provided all the UI components in the JDK 1.0 and 1.1 platforms. Although the Java 2 Platform still supports the AWT components, we strongly encourage you to use Swing components instead. You can identify Swing components because their names start with J. The AWT button class, for example, is named Button, whereas the Swing button class is named JButton. In addition, the AWT components are in the java.awt package, whereas the Swing components are in the javax.swing package.


As a rule, programs should not use "heavyweight" AWT components alongside Swing components. Heavyweight components include all the ready-to-use AWT components, such as Menu and ScrollPane, and all components that inherit from the AWT Canvas and Panel classes.

When Swing components (and all other "lightweight" components) overlap with heavyweight components, the heavyweight component is always painted on top.

Your first Swing program

Here, we examine the code for a simple program, HelloWorldSwing. Later, the examples will become progressively more difficult as we introduce and explain more features.

Here's a snapshot of the HelloWorldSwing program:

And here's the code for HelloWorldSwing:

Code:

import javax.swing.*;

public class HelloWorldSwing {
   public static void main(String[] args) {
      JFrame frame = new JFrame("HelloWorldSwing");
      final JLabel label = new JLabel("Hello World");
      frame.getContentPane().add(label);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setVisible(true);
   }
}

This is one of the simplest Swing applications you can write. It doesn't do much, but the code demonstrates the basic code in every Swing program:

  • Import the pertinent packages.
  • Set up a top-level container.

The first line imports the main Swing package:

Code:

import javax.swing.*;

This is the only package that HelloWorldSwing needs. However, most Swing programs also need to import two AWT packages:

Code:

import java.awt.*;
import java.awt.event.*;

These packages are required because Swing components use the AWT infrastructure, including the AWT event model. The event model governs how a component reacts to events, such as button clicks and mouse motion.

Every program with a Swing GUI must contain at least one top-level Swing container. A top-level Swing container provides the support that Swing components need to perform their painting and event handling. There are three top-level Swing containers: JFrame, JDialog, and (for applets) JApplet. Each JFrame object implements a single main window, and each JDialog implements a secondary window (a window that's dependent on another window).

Each JApplet object implements an applet's display area within a browser window.

The HelloWorldSwing example has only one top-level container, a JFrame. A frame, implemented as an instance of the JFrame class, is a window that has decorations, such as a border, a title, and buttons for iconifying and closing the window. Applications with a GUI typically use at least one frame.

Here is the code that sets up and shows the frame:

Code:

JFrame frame = new JFrame("HelloWorldSwing");
  ...
frame.pack();
frame.setVisible(true);
HelloWorldSwing also has one component, a label that reads "Hello World." These two
lines of code construct and then add the component to the frame:
Code:

final JLabel label = new JLabel("Hello World");
  frame.getContentPane().add(label);
To close the window when the close button is clicked, we include this code in our HelloWorldSwing program:

Code:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JFrame provides the setDefaultCloseOperation method to configure the default action for when the user clicks the close button. For single-window applications, most likely you want the application to exit. The EXIT_ON_CLOSE constant lets you specify this, as of version 1.3 of the Java 2 Platform.

Example two: SwingApplication

Let's look at another simple program, SwingApplication. Each time the user clicks the button (JButton), the label (JLabel) is updated.

Look and feel

The following figures show three views of a GUI that uses Swing components. Each picture shows the same program, SimpleExample, but with a different look and feel.

Figure 1: Java look and feel

Figure 2: CDE/Motif look and feel

Figure 3: Windows look and feel

Swing allows you to specify which look and feel your program uses -- Java look and feel, CDE/Motif look and feel, Windows look and feel, and so on. The code in boldface type in the following snippet shows you how SwingApplication specifies its look and feel:

Code:


public static void main(String[] args) {
   try { UIManager.setLookAndFeel(
      UIManager.getCrossPlatformLookAndFeelClassName());
   } catch (Exception e) { }
      ...// Create and show the GUI...
   }

The preceding code essentially says, "I don't care whether the user has chosen a look and feel-use the cross-platform look and feel (the Java look and feel)."

Setting up buttons and labels

Like most GUIs, the SwingApplication GUI contains a button and a label. (Unlike most GUIs, that's about all that SwingApplication contains.) Here's the code that initialises the button:

Code:

JButton button = new JButton("I'm a Swing button!");
button.setMnemonic('i');

button.addActionListener(...create an action listener...);

The first line creates the button. The second sets the letter "i" as the mnemonic that the user can use to simulate a click of the button. For example, in the Java look and feel, typing Alt-i results in a button click. The third line registers an event handler for the button click, as
discussed later.

Here's the code that initialises and manipulates the label:

Code:


...// where instance variables are declared:

private static String labelPrefix ="Number of button clicks: ";

private int numClicks = 0;

...// in GUI initialisation code:
final JLabel label = new JLabel(labelPrefix + "0 ");
...

label.setLabelFor(button);

...// in the event handler for button clicks:
label.setText(labelPrefix + numClicks);

The preceding code is pretty straightforward, except for the line that invokes the setLabelFor method. That code exists solely to hint to assistive technologies that the label describes the button.

Now that you know how to set up buttons, you also know how to set up check boxes and radio buttons, as they all inherit from the AbstractButton class. Check boxes are similar to radio buttons, but by convention their selection models are different. Any number of check boxes in a group -- none, some, or all -- can be selected. On the other hand, only one button can be selected from a group of radio buttons. The following figures show screenshots of two programs that use check boxes and radio buttons.

Figure 4: As you'd expect, the CheckBoxDemo application shows the use of check boxes, and the RadioButtonDemo application shows the use of radio buttons.


8578 bytes more | comments? | Printer Friendly Page  Send to a Friend | Score: 0
Posted by jalex on Thursday, January 04, 2007 (20:12:09) (6465 reads)

Previous 1060 Stories (530 Pages, 2 Per Page) Next

530| 529| 528| 527| 526| 525| 524| 523| 522| 521| 520| 519| 518| 517| 516| 515| 514| 513| 512| 511| 510| 509| 508| 507| 506| 505| 504| 503| 502| 501| 500| 499| 498| 497| 496| 495| 494| 493| 492| 491|
490
| 489| 488| 487| 486| 485| 484| 483| 482| 481| 480| 479| 478| 477| 476| 475| 474| 473| 472| 471| 470| 469| 468| 467| 466| 465| 464| 463| 462| 461| 460| 459| 458| 457| 456| 455| 454| 453| 452| 451| 450| 449| 448| 447| 446| 445| 444| 443| 442| 441| 440| 439| 438| 437| 436| 435| 434| 433| 432| 431| 430| 429| 428| 427| 426| 425| 424| 423| 422| 421| 420| 419| 418| 417| 416| 415| 414| 413| 412| 411| 410| 409| 408| 407| 406| 405| 404| 403| 402| 401| 400| 399| 398| 397| 396| 395| 394| 393| 392| 391| 390| 389| 388| 387| 386| 385| 384| 383| 382| 381| 380| 379| 378| 377| 376| 375| 374| 373| 372| 371| 370| 369| 368| 367| 366| 365| 364| 363| 362| 361| 360| 359| 358| 357| 356| 355| 354| 353| 352| 351| 350| 349| 348| 347| 346| 345| 344| 343| 342| 341| 340| 339| 338| 337| 336| 335| 334| 333| 332| 331| 330| 329| 328| 327| 326| 325| 324| 323| 322| 321| 320| 319| 318| 317| 316| 315| 314| 313| 312| 311| 310| 309| 308| 307| 306| 305| 304| 303| 302| 301| 300| 299| 298| 297| 296| 295| 294| 293| 292| 291| 290| 289| 288| 287| 286| 285| 284| 283| 282| 281| 280| 279| 278| 277| 276| 275| 274| 273| 272| 271| 270| 269| 268| 267| 266| 265| 264| 263| 262| 261| 260| 259| 258| 257| 256| 255| 254| 253| 252| 251| 250| 249| 248| 247| 246| 245| 244| 243| 242| 241| 240| 239| 238| 237| 236| 235| 234| 233| 232| 231| 230| 229| 228| 227| 226| 225| 224| 223| 222| 221| 220| 219| 218| 217| 216| 215| 214| 213| 212| 211| 210| 209| 208| 207| 206| 205| 204| 203| 202| 201| 200| 199| 198| 197| 196| 195| 194| 193| 192| 191| 190| 189| 188| 187| 186| 185| 184| 183| 182| 181| 180| 179| 178| 177| 176| 175| 174| 173| 172| 171| 170| 169| 168| 167| 166| 165| 164| 163| 162| 161| 160| 159| 158| 157| 156| 155| 154| 153| 152| 151| 150| 149| 148| 147| 146| 145| 144| 143| 142| 141| 140| 139| 138| 137| 136| 135| 134| 133| 132| 131| 130| 129| 128| 127| 126| 125| 124| 123| 122| 121| 120| 119| 118| 117| 116| 115| 114| 113| 112| 111| 110| 109| 108| 107| 106| 105| 104| 103| 102| 101| 100| 99| 98| 97| 96| 95| 94| 93| 92| 91| 90| 89| 88| 87| 86| 85| 84| 83| 82| 81| 80| 79| 78| 77| 76| 75| 74| 73| 72| 71| 70| 69| 68| 67| 66| 65| 64| 63| 62| 61| 60| 59| 58| 57| 56| 55| 54| 53| 52| 51| 50| 49| 48| 47| 46| 45| 44| 43| 42| 41| 40| 39| 38| 37| 36| 35| 34| 33| 32| 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| 15| 14| 13| 12| 11| 10| 9| 8| 7| 6| 5| 4| 3| 2| 1|


Home Code Examples Java Forum All Java Tips Books Submit News, Code... Search... Offshore Software Tech Doodling

RSS feed Java FAQ RSS feed Java FAQ News     

    RSS feed Java Forums RSS feed Java Forums

All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest 1999-2006 by Java FAQs Daily Tips.

Interactive software released under GNU GPL, Code Credits, Privacy Policy