You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例的文本框内容,自然看不到效果。

解决步骤

  1. 操作界面上的实际实例
    如果SaleInv是添加在Test JFrame中,需要从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字段,且该实例已添加到界面容器中

  2. 优化代码规范
    不要将文本框设为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);
    
  3. 增加空指针防护
    在获取表格选中行时,先判断r != -1,避免未选中行时调用getValueAt抛出异常。


内容的提问来源于stack exchange,提问作者Farhat Zaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:06:21