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...
KeyListener
, there are a swagger of problems associated with using KeyListener
s which the key bindings API fixes table.setRowSelectionInterval(rowCount-1,rowCount-1);
, but rowCount
is no longer valid, as you've added a new row 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
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.