在JFrame上放两个组件,一个是table,一个是txtNo.我意思是想在txtNo中输入一个值,当txtNo失去焦点的时候,修改table所选择行的第0列的值,table的model是自定义的,用vTable来保存表格的值. MyTableModel myTbMode = new MyTableModel( vCols , vTable);
JTable table = new JTable( myTbMode ); private void txtPeoNoFocusLost(java.awt.event.FocusEvent evt) {
            ( (String[]) vTable.elementAt(table.getSelectedRow()) )[0] = txtNo.getText();
    }
table.getSelectionModel().addListSelectionListener(
                new ListSelectionListener()
                {
                     public void valueChanged(ListSelectionEvent e)
                     {
                         //表格的选择事件;
                         //把焦点从txtNo移到table时候,先会触发这个事件,而且table的当前所 选择的行也变了.
                     }
                }            
        );
结果,当焦点在txtNo上的时候,假如此时table的当前选中的行是第1行,接着用鼠标点击table的第二行,按我的设想,这时候是table的第1行第0列的值修改成txtNo的值.当是,调试时候发现,table的行选择事件valueChanged先于txtNo的FocusLost事件发生,table的当前选中的行变成了第2行,然后再发生txtNo的FocusLost事件,这时候在txtNoFocusLost事件中就无法修改table最开始选中的第1行的值了.
不知道哪位仁兄有解决的方法.

解决方案 »

  1.   

    完整代码如下:
    /*
     * frmTest.java
     *
     * Created on 2006年4月1日, 下午1:32
     *//**
     *
     * @author  hicen
     */
    import java.util.Vector;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.event.TableModelListener;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.event.ListSelectionEvent;public class frmTest extends javax.swing.JFrame {
        Vector vTable = new Vector();
        Vector vCols = new Vector( );
       
        MyTableModel myTbMode = new MyTableModel( vCols , vTable);
        
        /** Creates new form frmTest */
        public frmTest() {
            vCols.add("序号");
            vCols.add( "工号" );
            vCols.add( "姓名" );
            initComponents();
            table.getSelectionModel().addListSelectionListener(
                    new ListSelectionListener()
                    {
                         public void valueChanged(ListSelectionEvent e)
                         {
                             //表格的选择事件;
                             tableSelRowEvent( e.getFirstIndex(),e.getLastIndex() );
                         }
                    }            
            );
        }
         private void tableSelRowEvent(int intFirstRow, int intLastRow)
        {
            //当表格有行选择时候,会触发这个;
            txtNo.setText( (( String[]) vTable.elementAt(table.getSelectedRow()) )[1] );
            txtName.setText( ((String[])vTable.elementAt(table.getSelectedRow()))[2] );
        }
        
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
        private void initComponents() {
            jScrollPane1 = new javax.swing.JScrollPane();
            table = new javax.swing.JTable();
            txtNo = new javax.swing.JTextField();
            txtName = new javax.swing.JTextField();
            jLabel1 = new javax.swing.JLabel();
            jLabel2 = new javax.swing.JLabel();
            btnAddTableRow = new javax.swing.JButton();        getContentPane().setLayout(null);        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            table.setModel(myTbMode);
            jScrollPane1.setViewportView(table);        getContentPane().add(jScrollPane1);
            jScrollPane1.setBounds(20, 120, 210, 220);        txtNo.addFocusListener(new java.awt.event.FocusAdapter() {
                public void focusLost(java.awt.event.FocusEvent evt) {
                    txtNoFocusLost(evt);
                }
            });        getContentPane().add(txtNo);
            txtNo.setBounds(70, 20, 160, 21);        txtName.addFocusListener(new java.awt.event.FocusAdapter() {
                public void focusLost(java.awt.event.FocusEvent evt) {
                    txtNameFocusLost(evt);
                }
            });        getContentPane().add(txtName);
            txtName.setBounds(70, 60, 160, 21);        jLabel1.setText("\u5de5\u53f7");
            getContentPane().add(jLabel1);
            jLabel1.setBounds(20, 20, 24, 15);        jLabel2.setText("\u59d3\u540d");
            getContentPane().add(jLabel2);
            jLabel2.setBounds(20, 60, 24, 15);        btnAddTableRow.setText("\u589e\u52a0\u8868\u683c\u884c");
            btnAddTableRow.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btnAddTableRowActionPerformed(evt);
                }
            });        getContentPane().add(btnAddTableRow);
            btnAddTableRow.setBounds(10, 90, 100, 25);        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width-241)/2, (screenSize.height-359)/2, 241, 359);
        }// </editor-fold>    private void txtNameFocusLost(java.awt.event.FocusEvent evt) {
    // TODO add your handling code her
            if( table.getSelectedRow() > -1)
                ( (String[]) vTable.elementAt(table.getSelectedRow()) )[2] = txtName.getText();
        }    private void btnAddTableRowActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
             String[] strFields = new String[22];                   
             strFields[0] = vTable.size() + "";
             vTable.add(strFields);     
             table.updateUI();
             table.setRowSelectionInterval( vTable.size()-1,vTable.size()-1 );
        }    private void txtNoFocusLost(java.awt.event.FocusEvent evt) {
    // TODO add your handling code here:
            if( table.getSelectedRow() > -1)
                ( (String[]) vTable.elementAt(table.getSelectedRow()) )[1] = txtNo.getText();
        }
        
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new frmTest().setVisible(true);
                }
            });
        }
        
        // Variables declaration - do not modify
        private javax.swing.JButton btnAddTableRow;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTable table;
        private javax.swing.JTextField txtName;
        private javax.swing.JTextField txtNo;
        // End of variables declaration
        
    }
    class MyTableModel extends AbstractTableModel 
    {
        private Vector columnNames;
        private Vector vRows;
           
        MyTableModel( Vector vCols , Vector vtbRows)
            {
             super();
             columnNames = vCols;
             vRows = vtbRows;
            }
            
            public int getColumnCount() 
            {
                return columnNames.size();
            }        public int getRowCount() 
            {
                if (vRows != null)
        {
         return getTableValues().size();
         } 
         else
         return 0;
            }
            
            public Class getColumnClass(int arg0)
        {
         return super.getClass();
        }        public Object getValueAt(int row, int col)
         {
         if (getTableValues() != null)
          {
         String aaa[]=( String[]) getTableValues().elementAt(row);
         return aaa[col];
         }
         else
                        return null;
         }        public void addTableModelListener(TableModelListener arg0)
        {
       // TODO 自动生成方法存根
         }        public String getColumnName(int col) 
            {
                return columnNames.elementAt(col).toString();
            }        public void removeTableModelListener(TableModelListener arg0)
         {
         // TODO 自动生成方法存根
          }        public Vector getTableValues()
         {
         if (vRows == null)
         {
         vRows= new Vector();
         }
         return vRows;
         }        public void setTableValues(Vector object)
         {
         vRows= object;
        }        public boolean isCellEditable(int row, int col) 
            {
                return false;
            }        public void setValueAt(Object value, int row, int col) 
            {
            }
    }
      

  2.   

    在valueChanged事件中加入这个语句就成了,奶奶的,花了老子一整天,还是对jtable不熟才这样啊,推荐大家遇到问题时候多看sdk中的demo.
    if(e.getValueIsAdjusting())
    {
        return;
    }