一个完整的Swing程序除了有窗口有组件之外,还要让这些按钮之类的组件可以点击,并且点击之后会执行一些操作。这个在Java中叫作事件。点击操作叫作事件,点击之后执行的内容则在事件处理中完成。具体怎么实现呢?接下来我们来看看具体的步骤
一、事件处理模型
当我们在窗体中放置了各种组件之后图形界面已经很丰富了,但是还不能响应用户的任何操作。若使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。
在事件处理的过程中,主要涉及三类对象。
- Event(事件):用户对组件的一次操作称为一个事件,以类的形式出现。例如,键盘操作对应的事件类是 KeyEvent。
- Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮 Button。
- Event Handler(事件处理者):接收事件对象并对其进行处理的对象事件处理器,通常就是某个 Java 类中负责处理事件的成员方法。
二、动作事件监听器
动作事件监听器是 Swing 中比较常用的事件监听器,很多组件的动作都会使用它监听,像按钮被里击、列表框中选择一项等。
事件名称:ActionEvent。
事件监听接口: ActionListener。
事件相关方法:
addActionListener() 添加监听,
removeActionListener() 删除监听。
涉及事件源:JButton、JList、JTextField 等。
以下是一个例子,点击按钮之后统计点击的次数:
package swing;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
/**
* 点击按钮统计点击次数
*/
public class Demo18_ActionListener extends JFrame{
JLabel label;
JButton button1;
int clicks=0;
public static void main(String[] args){
Demo18_ActionListener frame=new Demo18_ActionListener();
frame.setVisible(true);
}
public Demo18_ActionListener() {
setTitle("动作事件监听器示例");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtils.setCenter(this);//设置窗体大小600*800并居中
JPanel contentPane=new JPanel();
contentPane.setBorder(new EmptyBorder(50,50,50,50));
contentPane.setLayout(new BorderLayout(0,0));
setContentPane(contentPane);
label=new JLabel(" ");
label.setFont(new Font("楷体",Font.BOLD,35)); //修改字体样式
contentPane.add(label, BorderLayout.SOUTH);
button1=new JButton("我是普通按钮"); //创建JButton对象
button1.setFont(new Font("黑体",Font.BOLD,35)); //修改字体样式
button1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
label.setText("按钮被单击了 "+(clicks++)+" 次");
}
});
contentPane.add(button1);
}
}
三、焦点监听器
除了单击事件外,焦点事件监听器在实际项目中应用也比较广泛,例如将光标离开文本框时弹出对话框,或者将焦点返回给文本框等。
事件名称:FocusEvent。
事件监听接口: FocusListener。
事件相关方法:addFocusListener() 添加监听,removeFocusListener() 删除监听。
涉及事件源:Component 以及派生类。
FocusEvent 接口定义了两个方法,分别为 focusGained() 方法和 focusLost() 方法,其中 focusGained() 方法是在组件获得焦点时执行,focusLost() 方法是在组件失去焦点时执行。
以下是一个例子,在失去焦点和获得焦点的时候分别进行提示;
package swing;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/**
* FocusEvent 接口定义了两个方法,
* 分别为 focusGained() 方法和 focusLost() 方法,
* 其中 focusGained() 方法是在组件获得焦点时执行,
* focusLost() 方法是在组件失去焦点时执行。
*/
public class Demo19_FocusListener extends JFrame{
JLabel label;
JButton button1;
JTextField txtfield1;
public static void main(String[] args){
Demo19_FocusListener frame=new Demo19_FocusListener();
frame.setVisible(true);
}
public Demo19_FocusListener() {
setTitle("焦点事件监听器示例");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtils.setCenter(this);//设置窗体大小600*800并居中
JPanel contentPane=new JPanel();
contentPane.setBorder(new EmptyBorder(200,50,200,50));
contentPane.setLayout(new BorderLayout(0,0));
setContentPane(contentPane);
label=new JLabel(" ");
label.setFont(new Font("楷体",Font.BOLD,30)); //修改字体样式
contentPane.add(label, BorderLayout.SOUTH);
contentPane.add(new JButton("按钮"), BorderLayout.EAST);
txtfield1=new JTextField(); //创建文本框
txtfield1.setFont(new Font("黑体", Font.BOLD, 30)); //修改字体样式
txtfield1.addFocusListener(new FocusListener()
{
@Override
public void focusGained(FocusEvent arg0)
{
// 获取焦点时执行此方法
label.setText("文本框获得焦点,正在输入内容");
}
@Override
public void focusLost(FocusEvent arg0)
{
// 失去焦点时执行此方法
label.setText("文本框失去焦点,内容输入完成");
}
});
contentPane.add(txtfield1);
}
}
四、监听列表项选择事件
列表框控件 JList 会显示很多项供用户选择,通常在使用时会根据用户选择的列表项完成不同的操作。
以下是一个例子:
点击列表中的不同选项,显示不同的信息。
package swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* 监听列表的选择事件
*/
public class Demo20_ListSelectionListener extends JFrame{
private JList list;
private JLabel label;
public Demo20_ListSelectionListener() {
setTitle("监听列表项选择事件");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtils.setCenter(this);//设置窗体大小600*800并居中
JPanel contentPane=new JPanel();
contentPane.setBorder(new EmptyBorder(15,15,80,15));
contentPane.setLayout(new BorderLayout(0,0));
setContentPane(contentPane);
label=new JLabel(" ");
label.setFont(new Font("宋體", 1, 25));
label.setOpaque(true);
label.setBackground(Color.yellow);
contentPane.add(label,BorderLayout.SOUTH);
JScrollPane scrollPane=new JScrollPane();
contentPane.add(scrollPane,BorderLayout.CENTER);
list=new JList();
list.setVisibleRowCount(50);
list.setFont(new Font("宋體", 1, 20));
scrollPane.setViewportView(list);
String[] listData=new String[17];
listData[0]="《一点就通学Java》";
listData[1]="《一点就通学PHP》";
listData[2]="《一点就通学Visual Basic)》";
listData[3]="《一点就通学Visual C++)》";
listData[4]="《Java编程词典》";
listData[5]="《PHP编程词典》";
listData[6]="《C++编程词典》";
listData[7]="《一点就通学Java》";
listData[8]="《一点就通学PHP》";
listData[9]="《一点就通学Visual Basic)》";
listData[10]="《一点就通学Visual C++)》";
listData[11]="《Java编程词典》";
listData[12]="《PHP编程词典》";
listData[13]="《C++编程词典》";
listData[14]="《Java编程词典》";
listData[15]="《PHP编程词典》";
listData[16]="《C++编程词典》";
list.setListData(listData);
list.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
label.setText("感谢您购买:"+list.getSelectedValue());
}
});
setVisible(true);
}
public static void main(String[] args) {
Demo20_ListSelectionListener frame = new Demo20_ListSelectionListener();
}
}