在此列举四种方法:
- 自身类实现ActionListener接口,作为事件监听器
- 通过匿名类处理
- 通过内部类处理
- 通过外部类处理
参考资料
四种监听类
自身类实现ActionListener接口,作为事件监听器
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
| package com.star;
import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame;
public class Main extends JFrame implements ActionListener {
private JButton btBlue, btDialog;
public Main() {
setTitle("Java GUI 事件监听处理"); setBounds(100, 100, 500, 350); setLayout(new FlowLayout()); btBlue = new JButton("蓝色"); btBlue.addActionListener(this); btDialog = new JButton("弹窗"); btDialog.addActionListener(this); add(btBlue); add(btDialog); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
@Override public void actionPerformed(ActionEvent e) { if (e.getSource() == btBlue) { Container c = getContentPane(); c.setBackground(Color.BLUE); } else if (e.getSource() == btDialog) { JDialog dialog = new JDialog(); dialog.setBounds(300, 200, 400, 300); dialog.setVisible(true); } }
public static void main(String[] args) { new Main(); } }
|
通过匿名类处理
这是比较好的一种方法
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
| package com.star;
import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame;
public class Main extends JFrame {
private JButton btBlue, btDialog;
public Main() { setTitle("Java GUI 事件监听处理"); setBounds(100, 100, 500, 350); setLayout(new FlowLayout()); btBlue = new JButton("蓝色"); btBlue.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Container c = getContentPane(); c.setBackground(Color.BLUE); } });
btDialog = new JButton("弹窗"); btDialog.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JDialog dialog = new JDialog(); dialog.setBounds(300, 200, 400, 300); dialog.setVisible(true); } });
add(btBlue); add(btDialog); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
public static void main(String[] args) { new Main(); } }
|
通过内部类处理。
该种方法更符合面向对象编程的思想。
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
| package com.star;
import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame;
public class Main extends JFrame {
private JButton btBlue, btDialog; public Main() { setTitle("Java GUI 事件监听处理"); setBounds(100, 100, 500, 350); setLayout(new FlowLayout()); btBlue = new JButton("蓝色"); btBlue.addActionListener(new ColorEventListener()); btDialog = new JButton("弹窗"); btDialog.addActionListener(new DialogEventListener()); add(btBlue); add(btDialog); setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
class ColorEventListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Container c = getContentPane(); c.setBackground(Color.BLUE); } }
class DialogEventListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JDialog dialog = new JDialog(); dialog.setBounds(300, 200, 400, 300); dialog.setVisible(true); } }
public static void main(String[] args) { new Main(); } }
|
通过外部类处理
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
| package com.star;
import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame;
public class Main extends JFrame {
private JButton btBlue, btDialog;
public Main() { setTitle("Java GUI 事件监听处理"); setBounds(100, 100, 500, 350); setLayout(new FlowLayout()); btBlue = new JButton("蓝色"); btBlue.addActionListener(new ColorEventListener(this)); btDialog = new JButton("弹窗"); btDialog.addActionListener(new DialogEventListener()); add(btBlue); add(btDialog); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
public static void main(String[] args) { new Main(); } }
class ColorEventListener implements ActionListener { private Main el;
ColorEventListener(Main el) { this.el = el; }
@Override public void actionPerformed(ActionEvent e) { Container c = el.getContentPane(); c.setBackground(Color.BLUE); } }
class DialogEventListener implements ActionListener {
@Override public void actionPerformed(ActionEvent e) { JDialog dialog = new JDialog(); dialog.setBounds(300, 200, 400, 300); dialog.setVisible(true); } }
|
你可能注意到为什么我写了两个监听事件,就是加以区分这些方法的区别:
- 第一种的监听处理部分,如果有多个(我就写过三十多个的事件监听,包含菜单栏按钮事件监听和工具栏按钮事件监听),那就需要一个个去判断,从理论上说是影响程序速度的。
- 第二种和第三种比较常用,如果程序的监听事件比较少,可以用第二种,匿名类很合适。
- 第三种符合面向对象编程(可以设置内部类只提供自身类使用,而且方便使用自身类的资源),尤其是适合多个监听事件的处理,当然也适合第二种方法情况。
- 第四种是外部类,如果多个监听事件相同,就可以选用此种方法。