Hello experts:
The SSCCE below has a JTable with 2 columns and does the following:
#1 column1 is non-editable that contains an auto-generated row number and column2 is editable to allow user to enter data.
#2 Pressing the tab key skips the non-editable cell and puts the focus on the editable cell.
#3 The user after entering some data in the cell in column2 presses the tab key to add a new row, and enters data in the row just added, and so on....
Now, I want to prevent a new row from being added if the user does not enter anything in the editable cell in column2. I tried to do this, but it breaks #3.
Here is my SSCCE. Thanks for your help!!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.Toolkit;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
class SKUFilterTable extends JFrame implements ActionListener{
private DefaultTableModel model;
private JTable table;
private JScrollPane scrollpane;
private JPopupMenu popup;
SKUFilterTable() {
super("Editing Test");
setBounds(10,10,350,150);
makeTable();
// Show popup menu on right click
popup = new JPopupMenu();
JMenuItem menuItem = new JMenuItem("Delete Row");
menuItem.addActionListener( this );
popup.add( menuItem );
overRideTabBehavior();
scrollpane = new JScrollPane(table);
getContentPane().add(scrollpane);
setVisible(true);
}
private void makeTable(){
String [] columns = new String[] { "#", "SKU"};
Object[][] data = new String[][]
{ {"1", ""},};
model = new DefaultTableModel(data, columns);
table = new JTable(model){
public boolean isCellEditable(int row, int col) {
if (col == 1) return true;
return false;
}
};
//Set cell editor for column 2
int vColIndex = 1;
TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyEditor());
//to show popup menu
table.addMouseListener( new MouseAdapter(){
public void mousePressed(MouseEvent e) {
if ( SwingUtilities.isRightMouseButton(e) ) {
JTable source = (JTable)e.getSource();
int row = source.rowAtPoint( e.getPoint() );
int column = source.columnAtPoint( e.getPoint() );
//source.changeSelection(row, column, false, false);
if (! source.isRowSelected(row))
source.changeSelection(row, column, false, false);
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
//On start-up, put focus on the editable cell in first row.
//table.changeSelection(0, 1, false, false);
}
//Override the default tab behaviour.
//Tab to the next editable cell. When no editable cells goto next cell*/
private void overRideTabBehavior(){
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
final Action oldTabAction = table.getActionMap().get(im.get(tab));
Action tabAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
int rows = table.getRowCount();
int cols = table.getColumnCount();
int selectedRow = table.getSelectedRow();
int selectedCol = table.getSelectedColumn();
if((rows == (selectedRow+1)) && (cols == (selectedCol+1)) ){
model.addRow(new Object[]{getNextSeqNum(), ""});
}
oldTabAction.actionPerformed(e);
JTable table = (JTable) e.getSource();
int rowCount = table.getRowCount();
int columnCount = table.getColumnCount();
int row = table.getSelectedRow();
int column = table.getSelectedColumn();
while (!table.isCellEditable(row, column)) {
column += 1;
if (column == columnCount) {
column = 0;
row += 1;
}
if (row == rowCount) {
row = 0;
}
// Back to where we started, get out.
if (row == table.getSelectedRow() && column == table.getSelectedColumn()) {
break;
}
}//while
table.changeSelection(row, column, false, false);
}//actionPerformed
};
table.getActionMap().put(im.get(tab), tabAction);
table.setSurrendersFocusOnKeystroke(true);
}
public static void main(String [] args) {
new SKUFilterTable();
}
private int getNextSeqNum(){
int selectedRow = table.getSelectedRow();
int selectedCol = table.getSelectedColumn();
Object obj = (Object) table.getValueAt(selectedRow,selectedCol-1);
int i=Integer.parseInt(obj.toString());
return i+1;
}
private void deleteRow(DefaultTableModel imodel){
int selectedRow = table.getSelectedRow();
imodel.removeRow(selectedRow);
}
public void actionPerformed(ActionEvent e){
deleteRow(model);
}
//internal class
private class MyEditor extends DefaultCellEditor{
JTextField jtf;
public MyEditor(){
super(new JTextField());
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){
java.awt.Component c = super.getTableCellEditorComponent( table, value, isSelected, row, column);
if(c instanceof JTextField){
jtf = ((JTextField)c);
jtf.selectAll();
jtf.setText("");
jtf.setCaretPosition(0);
jtf.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
}
return c;
}
}//class MyEditor
}//main class