Java实现双查询、数据复选框及选中数据存入ArrayList求助
Java 数据库查询与复选框选择功能实现
需求
- 实现
selectAll方法:查询并展示数据库login表中的全部数据 - 实现条件查询
select方法:根据输入的姓名查询匹配的数据 - 为每条展示的数据添加复选框
- 勾选复选框时,将对应数据存入
ArrayList
用户提供的代码
JCheckBox[] buttons = new JCheckBox[4]; JCheckBox ch = new JCheckBox("전체선택", false); j2 = new JButton("초기화"); panel.add(l1); panel.add(tf1); panel.add(j1); panel.add(ch); panel.add(j2); this.add("North", panel); JButton s1 = new JButton("보내기"); p1.add(s1); this.add("South", p1); // 부착 connect(); // DB접속하는 메소드 selectAll(); //select(); j1.addActionListener(e -> { userValue = tf1.getText(); select(); }); public void selectAll() {//this is a 'select' function which is show all data of my DB try { String sql="select name, phone, address from login"; pstmt=con.prepareStatement(sql); System.out.println("pstmt : "+pstmt); rs1=pstmt.executeQuery(); System.out.println("rs : "+rs); while(rs1.next()) { String name=rs1.getString("name"); String age=rs1.getString("phone"); String tel=rs1.getString("address"); Object data[]= {name,age,tel}; model.addRow(data); } }catch(Exception e) { System.out.println("select() 실행 오류 : "+e); } } public void select() {//this is a second Search try { pstmt.setString(1, userValue); String sql="select name,phone,address from login where name = ?"; pstmt=con.prepareStatement(sql); rs=pstmt.executeQuery(); while(rs.next()) { String name=rs.getString("name"); String age=rs.getString("phone"); String tel=rs.getString("address"); Object data[]= {name,age,tel}; model.addRow(data); } } catch(Exception e1) { System.out.println("select() 실행 오류 : "+e1); } }
代码问题与修正方案
1. select方法参数设置顺序错误
当前代码先调用pstmt.setString(1, userValue)再创建PreparedStatement,会触发空指针异常。正确逻辑是先创建语句对象,再设置参数:
public void select() { try { String sql="select name,phone,address from login where name = ?"; PreparedStatement pstmt = con.prepareStatement(sql); // 先创建语句 pstmt.setString(1, userValue); // 再设置参数 ResultSet rs = pstmt.executeQuery(); model.setRowCount(0); // 查询前清空表格,避免新旧数据叠加 while(rs.next()) { String name=rs.getString("name"); String phone=rs.getString("phone"); String address=rs.getString("address"); Object data[]= {false, name, phone, address}; // 新增复选框列(布尔值) model.addRow(data); } // 及时关闭资源,防止数据库连接泄漏 rs.close(); pstmt.close(); } catch(Exception e1) { System.out.println("select() 실행 오류 : "+e1); } }
2. selectAll方法优化
添加表格清空和资源关闭逻辑,同时新增复选框列:
public void selectAll() { try { String sql="select name, phone, address from login"; PreparedStatement pstmt = con.prepareStatement(sql); ResultSet rs1 = pstmt.executeQuery(); model.setRowCount(0); // 清空原有数据 while(rs1.next()) { String name=rs1.getString("name"); String phone=rs1.getString("phone"); String address=rs1.getString("address"); Object data[]= {false, name, phone, address}; // 首列为复选框对应的布尔值 model.addRow(data); } rs1.close(); pstmt.close(); }catch(Exception e) { System.out.println("selectAll() 실행 오류 : "+e); } }
3. 实现复选框与选中数据存储
步骤1:初始化带复选框的表格模型
假设model是DefaultTableModel,初始化时指定列名并配置复选框渲染:
DefaultTableModel model = new DefaultTableModel(new Object[]{"선택", "이름", "전화번호", "주소"}, 0); JTable table = new JTable(model); // 设置首列为复选框样式 table.getColumnModel().getColumn(0).setCellRenderer(new JCheckBox()); table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()));
步骤2:全选复选框逻辑
ch.addActionListener(e -> { boolean isSelected = ch.isSelected(); for(int i=0; i<model.getRowCount(); i++) { model.setValueAt(isSelected, i, 0); } });
步骤3:获取选中数据存入ArrayList
为"보내기"按钮添加点击事件:
s1.addActionListener(e -> { ArrayList<Object[]> selectedData = new ArrayList<>(); for(int i=0; i<model.getRowCount(); i++) { boolean isChecked = (boolean) model.getValueAt(i, 0); if(isChecked) { String name = (String) model.getValueAt(i, 1); String phone = (String) model.getValueAt(i, 2); String address = (String) model.getValueAt(i, 3); selectedData.add(new Object[]{name, phone, address}); } } // 此处可根据需求处理选中数据,例如打印、保存到文件等 System.out.println("선택된 데이터 개수: " + selectedData.size()); });
4. 其他注意事项
- 避免使用全局的
PreparedStatement和ResultSet,建议在方法内局部声明并及时关闭,防止资源泄漏和线程安全问题 connect()方法需确保数据库连接正确关闭,可使用try-with-resources语法自动管理连接- 异常处理可进一步优化,例如添加界面弹窗提示,提升用户体验
内容的提问来源于stack exchange,提问作者최영준
相关产品推荐
相关产品推荐

