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的创建与数据模型绑定、按钮事件与鼠标事件的处理、表格行的动态增删及交互反馈的实现。表格组件是数据展示的核心控件,在管理系统、数据报表等场景中广泛应用,理解表格与事件监听的结合方式,对开发交互式桌面应用具有重要意义。