Throughout AWT, and all Java APIs for that matter, event handling has been consistent:
- Implement a listener interface (such as java.awt.event.ActionListener)
- Provide an implementation of all listener interface methods (such as actionPerformed( ActionEvent e ))
- Add your class as a listener to a component, which generates events by calling its addXXXListener() method (such as calling javax.swing.JButton‘s addActionListener() method)
i will go through 3 methods to perform Action Event Handling in Java
First method:
1- create a Handler Class in a separate file that implements from ActionListener interface.
2- overwrite the abstract method actionPerformed of the ActionListener interface, with the code we want to be executed upon the action on our object.
3- create instance of the Handler class, and add it as an action listener on the object we want like button for example.
Example :
in the following example we will create a button from the swing library, and apply the action that when a user click the button, we will show a message dialog.
File Handler.class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| import java.awt.event.*;import java.awt.*;
import javax.swing.*;/**
*
* @author ahmedabdelaliem
*/
//we create the Handler class and implement from ActionListener interface
public class Handler implements ActionListener{
//now we overwrite the abstract method of ActionListener interface
public void actionPerformed (ActionEvent event){
// here goes the code we want to execute when the action happen, for example show a message dialog with the below text
JOptionPane.showMessageDialog(null, "You Have just clicked the button");
}
} |
file ButtonTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| /** *
* @author ahmedabdelaliem
*/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.awt.*;
import javax.swing.*;// we create our class and inherit from JFrame to create our GUI
public class ButtonTest extends JFrame{
// we create an empty reference with JButton type
private JButton plainButton,;
// we create the constructor of the class
public ButtonTest(){
//set up the container
Container con = getContentPane();
con.setLayout(new FlowLayout());
// create an object of the JButton
plainButton = new JButton();
plainButton.setText("Regular Button"); // set the text on the button
//create an object of our Handler
Handler h = new Handler();
// now we add the Handler object we created as Action Listener for the button
plainButton.addActionListener(h);
//now we add the button to the container and show the frame.
con.add(plainButton);
setSize(400,300);
setVisible(true);
}
} |
file Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| /** *
* @author ahmedabdelaliem
*/
public class Main {
public static void main(String[] args) {
// we create an object of our ButtonTest Class
ButtonTest b1 = new ButtonTest();
b1.setDefaultCloseOperation(b1.EXIT_ON_CLOSE); }
} |
now the output of this simple application : a frame will show with a button on it, and when we click the button a message dialog will appear.
the disadvantage of this method is that we need to create a separate handler for each object we want a handler for,
for example if we have a form with 10 buttons with different actions when clicked, then we need to create 10 Handlers in 10 files with 10 different actions
that doesn’t make sense at all.
so this is why we follow one of the next 2 methods,
Method 2 : create the Handler class as inner class of our class to handle the actions on the components in our class
Example :
File : CheckButtonTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
| import javax.swing.*;import java.awt.*;
import java.awt.event.*;
/**
*
* @author ahmedabdelaliem
*/
public class CheckBoxTest extends JFrame{
JCheckBox b1,b2; // we create 2 referneces with JCheckBox type
JTextField t1; // we create 1 reference with JTextField type // we create the constructor of the class
public CheckBoxTest() {
//we call the constructor of our super class and give it the title of the frame
super ("Check Box Test");
//now we setup the container
Container con = getContentPane();
con.setLayout(new FlowLayout());
// we create the text field object with pre entered text
t1 = new JTextField("This is the test text");
// we set the font for the text field
t1.setFont( new Font("serif", Font.PLAIN, 14));
// now we add the text box to the container
con.add(t1);
// we create object for the checkbox and give it Bold value
b1 = new JCheckBox("Bold");
//we add the checkbox to the container
con.add(b1);
// we create another object for the second box and give it italic value
b2 = new JCheckBox("Italic");
// we add the checkbox to the container
con.add(b2);
// now we create the handler object
Handler h = new Handler();
// we add the handler as item listener for the 2 checkboxes
b1.addItemListener(h);
b2.addItemListener(h);
// now we view the frame
setSize(400,300);
setVisible(true);
}
// here we create the handler class as inner class
private class Handler implements ItemListener{
private int bold = Font.PLAIN; // we setup initial values for the bold, italic variables
private int italic = Font.PLAIN;
// we overwrite the abstract method of the ItemListener interface
public void itemStateChanged(ItemEvent event){
if (event.getSource() == b1){ // here we check which checkbox is checked
if (event.getStateChange() == event.SELECTED){ // here we check if it is selected or the selection is removed
bold = Font.BOLD; // if conditions apply, we set the bold variable as BOLD
//t1.set;
}else{
bold = Font.PLAIN;
}
}else if (event.getSource() == b2){
if (event.getStateChange() == event.SELECTED){
italic = Font.ITALIC;
}else{
italic = Font.PLAIN;
}
}
// here we add the 2 variables and apply the format to our font
t1.setFont(new Font("Serif", bold + italic, 14));
}
}
} |
File : Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| /**
*
* @author ahmedabdelaliem
*/
public class Main { /**
* @param args the command line arguments
*/
// TODO code application logic here
public static void main(String[] args) {
// TODO code application logic here
CheckBoxTest checkBox = new CheckBoxTest();
checkBox.setDefaultCloseOperation(CheckBoxTest.EXIT_ON_CLOSE);
}
} |
This method is better than the first one, cause it allow us to create one handler for many objects and the handler can reach and compare the variables of our main class.
The third method is to create an instance of