插入的行选择jTable

时间:2014-05-14 10:56:03

标签: java swing nullpointerexception jtable

我有一个JTable,当我选出第二列时,它会插入一个空行。我还添加了table.setRowSelectionInterval(lastRow,lastRow);以同时选择我的新插入行,但它会抛出java.lang.NullPointerException

需要帮助才能选择最后插入的行。在此先感谢。

public class JFrameTable extends javax.swing.JFrame {

protected JTable table;


public JFrameTable() {
    initComponents();

}

public  void setValueAt(int col){
     DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    if(col==2){
       Vector row = new Vector();
       row.add(null);
       row.add(null);
       row.add(null);
       row.add(null);

     model.addRow(row);
    }
}



private class MyKeyListener implements KeyListener {

    public MyKeyListener() {
    }

    @Override
    public void keyReleased(KeyEvent e) {

        if(e.getKeyCode()==e.VK_TAB){
            int column = jTable1.getSelectedColumn();
            int rowCount= jTable1.getRowCount();
            int currentRow=jTable1.getSelectedRow();
            if(currentRow==rowCount-1) {
                jTable1.editCellAt(currentRow, column);
                jTable1.transferFocus();
           }
           if(column==3 && currentRow==rowCount-1){
                setValueAt(2);
           }
           if(column==3){
              currentRow++;
              column=0;
              jTable1.editCellAt(currentRow, column);
              jTable1.transferFocus();
          try{                
              table.setRowSelectionInterval(rowCount-1,rowCount-1);
          }catch(Exception ek){
              System.out.println(ek);
          } 
          }
           System.out.println(rowCount);
          }

    }
     @Override
    public void keyTyped(KeyEvent e) {

    }
     @Override
    public void keyPressed(KeyEvent e) {

    }

}

private class MySelectionListener implements ListSelectionListener {

    public MySelectionListener() {
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {

    }
}


private class setTableModelListener implements TableModelListener{
    public void tableChanged(TableModelEvent e) {

}
}


@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTable1.setBackground(new java.awt.Color(75, 107, 221));
    jTable1.setFont(new java.awt.Font("SansSerif", 1, 15)); // NOI18N
    jTable1.setForeground(new java.awt.Color(254, 247, 247));
    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null}
        },
        new String [] {
            "Name", "Roll", "Stream", "Sex"
        }
    ) {
        boolean[] canEdit = new boolean [] {
            true, true, true, false
        };

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    jTable1.getModel().addTableModelListener(new setTableModelListener());
    jTable1.getTableHeader().setReorderingAllowed(false);
    jTable1.setRowHeight(20);
    jTable1.getTableHeader().setBackground(Color.BLACK);
    jTable1.getTableHeader().setFont(new Font ("SansSerif", Font.BOLD ,15));
    jTable1.getTableHeader().setForeground(Color.WHITE);
    jTable1.getColumnModel().getSelectionModel().addListSelectionListener(new MySelectionListener());
    jTable1.addKeyListener(new MyKeyListener());
    jTable1.setRowSelectionAllowed(true);
    jScrollPane1.setViewportView(jTable1);
    jTable1.getColumnModel().getColumn(0).setResizable(false);
    jTable1.getColumnModel().getColumn(0).setPreferredWidth(150);
    jTable1.getColumnModel().getColumn(1).setResizable(false);
    jTable1.getColumnModel().getColumn(1).setPreferredWidth(50);
    jTable1.getColumnModel().getColumn(2).setResizable(false);
    jTable1.getColumnModel().getColumn(2).setPreferredWidth(30);
    jTable1.getColumnModel().getColumn(3).setResizable(false);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(0, 95, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new JFrameTable().setVisible(true);

        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration                   
  }

2 个答案:

答案 0 :(得分:1)

有几件事情错了......

  1. 避免使用KeyListener,使用KeyListener table.setRowSelectionInterval(rowCount-1,rowCount-1);修复
  2. 时出现了大量问题
  3. 您使用rowCount选择了该行,但transferFocus不再有效,因为您添加了新行
  4. JTable用于将焦点转移到下一个可聚焦组件,这意味着import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.Vector; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; public class TestTable { public static void main(String[] args) { new TestTable(); } public TestTable() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } DefaultTableModel model = new DefaultTableModel(4, 4); JTable table = new JTable(model); InputMap im = table.getInputMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "CellAction"); ActionMap am = table.getActionMap(); am.put("CellAction", new CellAction(table)); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class CellAction extends AbstractAction { private JTable table; public CellAction(JTable table) { this.table = table; } @Override public void actionPerformed(ActionEvent e) { int column = table.getSelectedColumn(); int rowCount = table.getRowCount(); int currentRow = table.getSelectedRow(); if (currentRow == rowCount - 1) { table.editCellAt(currentRow, column); } if (column == 3 && currentRow == rowCount - 1) { DefaultTableModel model = (DefaultTableModel) table.getModel(); Vector row = new Vector(); row.add(null); row.add(null); row.add(null); row.add(null); model.addRow(row); } if (column == 3) { currentRow++; column = 0; table.setRowSelectionInterval(currentRow, currentRow); table.setColumnSelectionInterval(column, column); table.editCellAt(currentRow, column); } } } } 很可能会失去焦点,非常确定这不是您想要的。
  5. 例如......

    {{1}}

答案 1 :(得分:0)

似乎拼写错误的问题,只需更改

table.setRowSelectionInterval(rowCount-1,rowCount-1);

jTable1.setRowSelectionInterval(rowCount-1,rowCount-1);

因为table为空。在任何地方,您都使用jTable1