Java Swing 表格行增删实战解析:JTable与事件监听的综合应用
一、原题完整代码呈现
以下是计算机二级Java考试中关于Swing表格组件(JTable)的典型题型,主要考察接口实现、构造方法、事件绑定、容器获取、窗口标题设置及鼠标监听,包含6处需要填写的空白(标记为//*********Found********
):
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
//*********Found********
public class Java_2 ______________ ActionListener{
JTable table = null;
DefaultTableModel defaultModel = null;
//*********Found********
public __________(){
JFrame f = new JFrame();
String[] name = {"字段 1","字段 2","字段 3","字段 4","字段 5"};
String[][] data = new String[5][5];
int value =1;
for(int i=0; i<data.length; i++){
for(int j=0; j<data.length ; j++)
data[i][j] = String.valueOf(value++);
}
defaultModel = new DefaultTableModel(data,name);
table=new JTable(defaultModel);
table.setPreferredScrollableViewportSize(new Dimension(400, 80));
JScrollPane s = new JScrollPane(table);
JPanel panel = new JPanel();
JButton b = new JButton("增加行");
panel.add(b);
//*********Found********
b.______________(this);
b = new JButton("删除行");
panel.add(b);
b.addActionListener(this);
//*********Found********
Container contentPane = f._______________();
contentPane.add(panel, BorderLayout.NORTH);
contentPane.add(s, BorderLayout.CENTER);
//*********Found********
f.______________("增删表格行");
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//*********Found********
table.______________(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(table.isCellSelected(table.getSelectedRow(), table.getSelectedColumn())){
int selRow=table.getSelectedRow();
int selCol=table.getSelectedColumn();
JOptionPane.showMessageDialog(null,
"位于 ("+selRow+","+selCol+")的元素: "+table.getValueAt(selRow,selCol),
"PLAIN_MESSAGE", JOptionPane.PLAIN_MESSAGE);
}
}
});
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("增加行"))
defaultModel.addRow(new Vector());
if(e.getActionCommand().equals("删除行")){
int rowcount = defaultModel.getRowCount()-1; //getRowCount返回行数,rowcount<0代表已经没有任何行了。
if(rowcount >= 0){
defaultModel.removeRow(rowcount);
defaultModel.setRowCount(rowcount);
}
}
table.revalidate();
}
public static void main(String[] args) {
new Java_2();
}
}
二、空白处逐一解析与解答
1. 第一处空白:实现动作监听接口
答案:implements
//*********Found********
public class Java_2 implements ActionListener{
解析:
类中定义了actionPerformed(ActionEvent e)
方法,用于处理按钮点击事件,这要求类必须实现ActionListener
接口。Java中实现接口的关键字是implements
,因此填写implements
。
2. 第二处空白:定义构造方法
答案:Java_2
//*********Found********
public Java_2(){
解析:
构造方法是类的特殊方法,用于初始化对象,名称必须与类名完全一致(包括大小写)。当前类名为Java_2
,因此构造方法名应为Java_2
,填写Java_2
。
3. 第三处空白:绑定按钮动作监听器
答案:addActionListener
//*********Found********
b.addActionListener(this);
解析: JButton
需要通过addActionListener()
方法绑定监听器,以响应点击事件。当前类实现了ActionListener
接口,this
表示当前对象,因此调用该方法将监听器与按钮关联,填写addActionListener
。
4. 第四处空白:获取窗口内容面板
答案:getContentPane
//*********Found********
Container contentPane = f.getContentPane();
解析: JFrame
的内容面板(ContentPane
)是添加组件的容器,通过getContentPane()
方法获取。组件需添加到内容面板而非直接添加到JFrame
,因此填写getContentPane
。
5. 第五处空白:设置窗口标题
答案:setTitle
//*********Found********
f.setTitle("增删表格行");
解析: JFrame
的setTitle(String title)
方法用于设置窗口标题栏的文本。题目要求窗口标题为“增删表格行”,因此填写setTitle
。
6. 第六处空白:为表格添加鼠标监听器
答案:addMouseListener
//*********Found********
table.addMouseListener(new MouseAdapter() {
解析: JTable
需要通过addMouseListener()
方法绑定鼠标监听器,以响应鼠标点击事件。MouseAdapter
是鼠标监听器接口的适配器类,便于实现所需方法,因此填写addMouseListener
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序实现一个带表格的图形界面应用,核心功能包括:
- 显示一个5x5的表格(初始数据为1-25的连续数字)
- 提供“增加行”按钮:在表格末尾添加一行空数据
- 提供“删除行”按钮:删除表格最后一行数据
- 表格交互:点击任意单元格,弹出对话框显示该单元格的位置(行、列索引)及内容
运行说明
程序启动后,显示标题为“增删表格行”的窗口:
- 北部(顶部):包含“增加行”和“删除行”两个按钮的面板
- 中央区域:带滚动条的表格(初始显示5行5列数据,值为1-25)
操作流程:
- 点击“增加行”:表格末尾新增一行空行
- 点击“删除行”:删除表格最后一行(若表格不为空)
- 点击表格任意单元格:弹出对话框,显示格式如“位于 (0,1)的元素:2”(行、列索引从0开始)
- 退出方式:点击窗口右上角关闭按钮,程序终止运行
五、核心知识点总结
JTable与数据模型
- 表格模型:
DefaultTableModel
是JTable
的默认数据模型,通过new DefaultTableModel(data, name)
初始化(data
为二维数组数据,name
为列名数组) - 表格创建:
JTable table = new JTable(defaultModel)
将表格与数据模型关联 - 滚动支持:
JScrollPane s = new JScrollPane(table)
为表格添加滚动条,适应数据量超过显示区域的情况
- 表格模型:
接口实现与事件监听
- 动作监听:
public class Java_2 implements ActionListener
使类具备处理按钮点击事件的能力,通过actionPerformed(ActionEvent e)
方法实现具体逻辑 - 事件绑定:
b.addActionListener(this)
将按钮与当前类绑定,按钮点击时触发actionPerformed
方法 - 命令识别:
e.getActionCommand().equals("增加行")
通过按钮文本区分不同按钮的事件
- 动作监听:
容器与布局管理
- 内容面板:
f.getContentPane()
获取JFrame
的内容容器,所有组件需添加到该面板 - 布局管理器:使用
BorderLayout
(默认布局),按钮面板放在北部(BorderLayout.NORTH
),表格放在中央(BorderLayout.CENTER
) - 窗口设置:
f.pack()
自动调整窗口大小以适应组件,f.setVisible(true)
使窗口可见
- 内容面板:
鼠标监听与交互反馈
- 鼠标监听:
table.addMouseListener(new MouseAdapter())
为表格添加鼠标监听器,MouseAdapter
简化了接口实现(只需重写所需方法) - 单元格选择:
table.getSelectedRow()
和table.getSelectedColumn()
获取选中单元格的行、列索引 - 反馈对话框:
JOptionPane.showMessageDialog(...)
弹出信息对话框,显示单元格位置和内容
- 鼠标监听:
表格行操作
- 增加行:
defaultModel.addRow(new Vector())
通过数据模型向表格添加空行 - 删除行:
defaultModel.removeRow(rowcount)
删除指定行(此处删除最后一行) - 刷新表格:
table.revalidate()
通知表格数据模型已更新,刷新显示
- 增加行:
六、常见错误与应试技巧
常见错误分析
- 第一处空白接口实现错误:写成
extends ActionListener
(接口不能继承,只能实现)或拼写错误(如implemets
) - 第二处空白构造方法错误:写成
Java2
(类名不符)或java_2
(大小写错误),导致无法初始化对象 - 第三处空白事件绑定错误:写成
addActionLister
(拼写错误)或addListener
(方法名错误),按钮点击无响应 - 第四处空白内容面板错误:写成
getContentPane()
以外的方法(如getPanel()
),无法正确获取容器 - 第五处空白标题设置错误:写成
setTitle()
以外的方法(如setName()
),窗口标题不生效 - 第六处空白鼠标监听错误:写成
addMouseListener()
以外的方法(如addClickListener()
),表格点击无响应
- 第一处空白接口实现错误:写成
应试技巧
- 接口与类关系:"接口用implements实现,类用extends继承"
- 事件监听三步:"实现接口→绑定监听器→重写处理方法"
- 表格操作核心:"通过DefaultTableModel操作行,而非直接操作JTable"
- 布局管理原则:"组件添加到ContentPane,BorderLayout分区域放置"
- 调试技巧:输出按钮命令(
e.getActionCommand()
)或单元格索引,验证事件是否正确触发
通过本题,我们掌握了JTable的创建与数据模型绑定、按钮事件与鼠标事件的处理、表格行的动态增删及交互反馈的实现。表格组件是数据展示的核心控件,在管理系统、数据报表等场景中广泛应用,理解表格与事件监听的结合方式,对开发交互式桌面应用具有重要意义。