Вопрос

I have a JTable that inserts an empty row when ever i tab out the 2nd last column this works fine. I also added table.setRowSelectionInterval(lastRow,lastRow); to select my new inserted row at the same time but it throwing a java.lang.NullPointerException

Need help to select the last inserted row. Thanks in Advance.

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                   
  }
Это было полезно?

Решение

There are several things wrong...

  1. Avoid KeyListener, there are a swagger of problems associated with using KeyListeners which the key bindings API fixes
  2. You select the row by using table.setRowSelectionInterval(rowCount-1,rowCount-1);, but rowCount is no longer valid, as you've added a new row
  3. transferFocus is used to transfer focus to the next focusable component, which will mean that the JTable would mostly likely lose focus, pretty sure this isn't what you want.

For example...

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);
            }
        }

    }

}

Другие советы

Seems problem in misspelling, just change

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

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

Because table is null. And everywhere you use jTable1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top