Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Force user to enter data in editable cell

843807Oct 21 2009 — edited Oct 29 2009
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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 26 2009
Added on Oct 21 2009
9 comments
212 views