A Quick Java Swing Tutorial

Download Report

Transcript A Quick Java Swing Tutorial

A Quick Java
Swing Tutorial
1
Introduction
• Swing – A set of GUI classes
– Part of the Java's standard library
– Much better than the previous library: AWT
• Abstract Window Toolkit
• Highlights
– A rich set of widgets
• Widget: Any GUI element (also called: components)
– Contents and shape are separated (MVC support)
– Fine-grained control over the behavior and look and feel
– Platform independent
• Isolates the programmer from the operating system's GUI
2
Swing Components
• Containers
– Contain and manage other components.
– Top Level/Internal
– Examples: JFrame (Top Level), JScrollPane, JPanel.
• Basic controls
– Atomic components
– Used for showing ouput and/or getting some input
– Inherits JComponent
– Examples: JButton, JLabel, JTextArea, JTable,
Jlist
• Usually every Swing class extends the corresponding AWT class
– For backward-compatibility reasons
3
My First Swing Program
import javax.swing.*;
import java.awt.BorderLayout;
public class First {
public static void main(String[] args) {
JFrame frame = new JFrame("My First Frame");
// operation to do when the window is closed.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new JLabel("I Love Swing"),
BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
}
4
Top Level Containers: JFrame
• javax.swing.JFrame:
– Top-level window with a title and a border.
– Usually used as a program's main window
5
More on JFrame
• Made of several layers
• Widgets are added to the Content Pane layer.
– Use getContentPane() to obtain it
• Other layers are used for customizing the window's
appearence
6
Top Level Containers: JDialog
• javax.swing.JDialog:
–
–
–
–
More simple and limited than frames
Typically used for showing a short message on the screen
Also has a border and a title bar
May have an owner
• If the owner is invisible the dialog will also be invisible
– Use the static method of JoptionPane to show standard dialog boxes:
JOptionPane.showMessageDialog(null, "4+2=6");
7
Top Level Containers: JFileChooser
• javax.swing.JFileChooser:
– Allows the the user to choose a file
– Supports “open” and “save”: showOpenDialog(),showSaveDialog()
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION)
System.out.println("File: " + fc.getSelectedFile());
8
Example Program
• Using JFileChooser
import javax.swing.*;
import java.awt.BorderLayout;
public class Second {
public static void main(String[] args) {
JFrame frame = new JFrame("My First Frame");
// operation to do when the window is closed.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new JLabel("I Love Swing"),
BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
if(returnVal ==
JFileChooser.APPROVE_OPTION)
System.out.println("File: " +
fc.getSelectedFile());
}
}
Amending this to choose a file for
input
import javax.swing.*;
import java.awt.BorderLayout;
import java.io.*;
public class Third {
public static void main(String[] args) {
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION)
System.out.println("File: " + fc.getSelectedFile());
Next
try
{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new
FileInputStream(fc.getSelectedFile());
// Convert our input stream to a
// DataInputStream
DataInputStream in =
new DataInputStream(fstream);
finally
// Continue to read lines while
// there are still some left to read
while (in.available() !=0)
{
// Print file line to screen
System.out.println (in.readLine());
}
in.close();
}
catch (Exception e)
{
System.err.println("File input error");
}
}
}
And Using this to save a file for
Output
import javax.swing.*;
import java.awt.BorderLayout;
import java.io.*;
public class Fourth {
public static void main(String[] args) {
JFileChooser fc = new JFileChooser();
int returnVal = fc.showSaveDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION)
System.out.println("File: " + fc.getSelectedFile());
FileOutputStream out; // declare a file output object
PrintStream p; // declare a print stream object
try
{
// Create a new file output stream
// connected to "myfile.txt"
out = new FileOutputStream(fc.getSelectedFile());
// Connect print stream to the output stream
p = new PrintStream( out );
p.println ("This is written to a file");
p.close();
}
catch (Exception e)
{
System.err.println ("Error
writing to file");
}
}
}
Internal Containers
• Not Top level containers
• Can contain other non-top level components
• Examples:
– JScrollPane: Provides a scrollable view of its
components
– JSplitPane: Separates two components
– JTabbedPane: User chooses which
component to see
19
Containers - Layout
• Each container has a layout manager
– Determines the size, location of contained widgets.
• Setting the current layout of a container:
void setLayout(LayoutManager lm)
• LayoutManager implementing
– BorderLayout
– BoxLayout
– FlowLayout
– GridLayout
20
classes:
Containers - Layout
21
Swing Components
22
Swing Components
23
First Swing Program Revisited
import javax.swing.*;
import java.awt.BorderLayout;
Create a frame
public class First {
public static void main(String[] args) {
JFrame frame = new JFrame("My First Frame");Choose the border
layout
// operation to do when the window is closed.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new JLabel("I Love Swing"),
BorderLayout.CENTER);
frame.pack();
Create a text
frame.setVisible(true);
label
}
Add the label to
Specify
CENTER
}
the content pane
as the layout
position
24
Input
• So we now know how to present widgets on the screen
• A program also needs to react to the user's actions
• Examples:
– When the user presses a button we want to save a file
– When the user closes the program we want to ask “are you
sure?”
– ...
• Swing mechanism: Events and Listeners
25
Events, Listeners
• Swing defines all sorts of Listener interfaces
– E.g.: ActionListener, MouseMotionListener,
WindowListener, ...
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent e);
}
public interface MouseMotionListener extends EventListener {
public void mouseDragged(MouseEvent e);
public void mouseMoved(MouseEvent e);
}
• There are default (empty) implementations for many of the listeners
– E.g.: MouseMotionAdapter, WindowAdapter
26
Events, Listeners (cont.)
• A listener is an object that implements a listener interface
• If we need to react to an event (on a certain widget) we register a
listener object with that widget
• E.g.: addActionListener() registers an action listener with its receiver:
JButton button = new JButton();
ActionListener listener = ...;
button.addActionListener(listener);
• When an event occurs, all registered listeners are notified
– The appropriate listener method (e.g: actionPerformed()) is
invoked
– An object describing the event is passed as a parameter
27
Event Handling Demo: GUI
28
Event Handling Demo: Code
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Events implements ActionListener {
public Events() {
JFrame frame = new JFrame("Events");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());
JButton b = new JButton("Click me!");
b.addActionListener(this);
frame.getContentPane().add(b);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Thank you");
}
public static void main(String[] args) { new Events(); }
}
29
Inner Classes
• Nested within another classes
• Instance specific:
– Has access to methods & fields of the object that
created it
– => An inner class has TWO this variables
• Can be static
– Can access only static members and methods only
– A static method cannot create a non-static inner class
30
Local Classes
• Same as inner classes but defined inside a method
• Has access to local variables of the enclosing method
– Only if the variable is defined as final
• Can be anonymous
– Doesn’t have a name.
31
Event Handling Demo: Local Class
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Events {
public Events() {
JFrame frame = new JFrame("Events");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());
JButton b = new JButton("Click me!");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Thank you");
}
});
frame.getContentPane().add(b);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args)
}
32
{ new Events(); }
Example of using RadioButtons
•
•
•
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
•
•
public class SelectRadioButton{
JLabel label;
•
•
•
•
•
•
•
•
public SelectRadioButton(){
JFrame frame = new JFrame("Radio button selection");
JRadioButton first = new JRadioButton("First");
JRadioButton second = new JRadioButton("Second");
JRadioButton third = new JRadioButton("Third");
JRadioButton fourth = new JRadioButton("Fourth");
JRadioButton fifth = new JRadioButton("Fifth");
• JPanel panel = new JPanel();
•
panel.add(first);
•
panel.add(second);
•
panel.add(third);
•
panel.add(fourth);
•
panel.add(fifth);
•
ButtonGroup bg = new ButtonGroup();
•
bg.add(first);
•
bg.add(second);
•
bg.add(third);
•
bg.add(fourth);
•
bg.add(fifth);
•
•
•
•
•
•
•
•
•
•
•
•
•
first.addActionListener(new MyAction());
second.addActionListener(new MyAction());
third.addActionListener(new MyAction());
fourth.addActionListener(new MyAction());
fifth.addActionListener(new MyAction());
label = new JLabel("Roseindia.net");
frame.add(panel, BorderLayout.NORTH);
frame.add(label, BorderLayout.CENTER);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
• public class MyAction implements ActionListener{
•
public void actionPerformed(ActionEvent e){
•
label.setText(e.getActionCommand());
•
JOptionPane.showMessageDialog(null,"This is the "
+ e.getActionCommand() +
• " radio button.");
•
}
• }
• public static void main(String[] args){
•
SelectRadioButton sr = new SelectRadioButton();
• }
• }
CheckBox example
• Compliments of Java Docs
Structure of Exams
• 4 questions
• Do 1 and any 2 others
Declare Checkboxes
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//Note: Help for getting the below source code is taken from Java Sun Website
public class JCheckBoxDemo extends JPanel {
//Four accessory choices provide for 16 different combinations
JCheckBox jcbChin;
JCheckBox jcbGlasses;
JCheckBox jcbHair;
JCheckBox jcbTeeth;
Add an Item listener for each of the
checkboxes
/* The image for each combination is contained in a
separate image file whose name indicates the accessories.
The filenames are "geek-XXXX.gif" where XXXX can be one
* of the following 16 choices.
*/
StringBuffer choices;
JLabel jlbPicture;
CheckBoxListener myListener = null;
public JCheckBoxDemo() {
// Add an item listener for each of the check boxes.
// This is the listener class which contains business logic
myListener = new CheckBoxListener();
Add item listeners and Key Stroke
access
// Create check boxes with default selection true
jcbChin = new JCheckBox("Chin");
jcbChin.setMnemonic(KeyEvent.VK_C);
Box
jcbChin.setSelected(true);
jcbChin.addItemListener(myListener);
jcbGlasses = new JCheckBox("Glasses");
jcbGlasses.setMnemonic(KeyEvent.VK_G);
check Box
jcbGlasses.setSelected(true);
jcbGlasses.addItemListener(myListener);
//Alt+C Checks/Unchecks the check
//Alt+G Checks/Unchecks the
And Again
jcbHair = new JCheckBox("Hair");
jcbHair.setMnemonic(KeyEvent.VK_H);
Checks/Unchecks the check Box
jcbHair.setSelected(true);
jcbHair.addItemListener(myListener);
jcbTeeth = new JCheckBox("Teeth");
jcbTeeth.setMnemonic(KeyEvent.VK_T);
Checks/Unchecks the check Box
jcbTeeth.setSelected(true);
jcbTeeth.addItemListener(myListener);
//Alt+H
//Alt+T
Default Image
// Indicates what's on the geek.
choices = new StringBuffer("cght");//Default Image has
all the parts.
// Set up the picture label
jlbPicture = new JLabel(new ImageIcon("geek-" +
choices.toString().trim() + ".gif"));
jlbPicture.setToolTipText(choices.toString().trim());
Add Checkboxes
// Put the check boxes in a column in a panel
JPanel jplCheckBox = new JPanel();
jplCheckBox.setLayout(new GridLayout(0,
1)); //0 rows, 1 Column
jplCheckBox.add(jcbChin);
jplCheckBox.add(jcbGlasses);
jplCheckBox.add(jcbHair);
jplCheckBox.add(jcbTeeth);
Impose Layout
setLayout(new BorderLayout());
add(jplCheckBox, BorderLayout.WEST);
add(jlbPicture, BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(20,
20,20,20));
}
Listen for Checkbox event and get
source
//Listens to the check boxes events
class CheckBoxListener implements
ItemListener {
public void itemStateChanged(ItemEvent e) {
int index = 0;
char c = '-';
Object source = e.getSource();
if (source == jcbChin) {
index = 0;
c = 'c';
}
else if (source == jcbGlasses) {
index = 1;
c = 'g';
} else if (source == jcbHair) {
index = 2;
c = 'h';
} else if (source == jcbTeeth) {
index = 3;
c = 't';
}
Depending on whats clicked
display appropriate GIF
if (e.getStateChange() == ItemEvent.DESELECTED)
c = '-';
choices.setCharAt(index, c);
jlbPicture.setIcon(new ImageIcon("geek-"
+ choices.toString().trim() + ".gif"));
jlbPicture.setToolTipText(choices.toString());
}
}
}
Display Title and Border
public static void main(String s[]) {
JFrame frame = new JFrame("JCheckBox Usage Demo");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setContentPane(new JCheckBoxDemo());
frame.pack();
frame.setVisible(true);
}