JFrame向JPanel传递表格选中行数据失败问题求助
问题描述
我有一个PrdList JFrame,里面包含表格和按钮。按钮触发事件后能获取表格选中行的数据,填充到另一个JFrame的文本框,这个功能正常。但把数据填充到SaleInv JPanel的文本框时却失效了。相关代码如下:
问题相关代码
PrdList类(表格加载)
public class PrdList extends javax.swing.JFrame { public PrdList() { initComponents(); tb_load(); } public void tb_load(){ try { DefaultTableModel dt = (DefaultTableModel) jTable1.getModel(); dt.setRowCount(0); Statement s = db.mycon().createStatement(); ResultSet rs = s.executeQuery(" SELECT * FROM product"); while (rs.next()) { Vector v = new Vector(); v.add(rs.getString(3)); v.add(rs.getString(2)); dt.addRow(v); } } catch (SQLException e) { System.out.println(e); } }
表格行选择事件代码
private void jTable1KeyPressed(java.awt.event.KeyEvent evt) { // TODO add your handling code here: int r = jTable1.getSelectedRow(); String name = jTable1.getValueAt(r, 1).toString(); String bcode = jTable1.getValueAt(r, 2).toString(); }
打开Test JFrame的按钮事件代码
public Test tst = new Test(); private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: tst.setVisible(true); }
SaleInv JPanel类代码
public class SaleInv extends javax.swing.JPanel { public SaleInv() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { bcode_txt = new javax.swing.JTextField(); name_txt = new javax.swing.JTextField(); public javax.swing.JTextField bcode_txt; public javax.swing.JTextField name_txt; } public SaleInv saleinv = new SaleInv();
失效的填充JPanel文本框按钮代码
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { int r = jTable1.getSelectedRow(); String bcode = jTable1.getValueAt(r, 0).toString(); String name = jTable1.getValueAt(r, 1).toString(); saleinv.bcode_txt.setText(bcode); saleinv.name_txt.setText(name); }
问题原因及解决办法
核心问题
你在PrdList中实例化的saleinv对象,和实际显示在界面上的SaleInv JPanel实例不是同一个对象。你调用saleinv.bcode_txt.setText()只是修改了一个未添加到任何容器的JPanel实例的文本框内容,自然看不到效果。
解决步骤
操作界面上的实际实例
如果SaleInv是添加在TestJFrame中,需要从Test获取已显示的SaleInv实例,而非在PrdList中重新创建。示例代码:private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { int r = jTable1.getSelectedRow(); if (r == -1) return; // 未选中行时直接返回,避免空指针 String bcode = jTable1.getValueAt(r, 0).toString(); String name = jTable1.getValueAt(r, 1).toString(); // 获取Test界面上的真实SaleInv实例 tst.saleInvInstance.bcode_txt.setText(bcode); tst.saleInvInstance.name_txt.setText(name); }注:需确保
Test类中存在public SaleInv saleInvInstance字段,且该实例已添加到界面容器中优化代码规范
不要将文本框设为public,应在SaleInv中提供setter方法:public class SaleInv extends javax.swing.JPanel { // ... 原有代码 ... public void setBcode(String bcode) { this.bcode_txt.setText(bcode); } public void setName(String name) { this.name_txt.setText(name); } }调用时改为:
tst.saleInvInstance.setBcode(bcode); tst.saleInvInstance.setName(name);增加空指针防护
在获取表格选中行时,先判断r != -1,避免未选中行时调用getValueAt抛出异常。
内容的提问来源于stack exchange,提问作者Farhat Zaman
相关产品推荐
相关产品推荐

