public void moveRow(int start, int end, int to)
	{
		if (start < 0)
		{
			String message = "Start index must be positive: " + start;
			throw new IllegalArgumentException( message );
		}

		if (end > getRowCount() - 1)
		{
			String message = "End index must be less than total rows: " + end;
			throw new IllegalArgumentException( message );
		}

		if (start > end)
		{
			String message = "Start index cannot be greater than end index";
			throw new IllegalArgumentException( message );
		}

		int rowsMoved = end - start + 1;

		if (to < 0
		||  to > getRowCount() - rowsMoved)
		{
			String message = "New destination row (" + to + ") is invalid";
			throw new IllegalArgumentException( message );
		}

		//  Save references to the rows that are about to be moved

		ArrayList<T> temp = new ArrayList<T>(rowsMoved);

		for (int i = start; i < end + 1; i++)
		{
			temp.add(modelData.get(i));
		}

		//  Remove the rows from the current location and add them back
		//  at the specified new location

		modelData.subList(start, end + 1).clear();
		modelData.addAll(to, temp);

		//  Determine the rows that need to be repainted to reflect the move

		int first;
		int last;

		if (to < start)
		{
			first = to;
			last = end;
		}
		else
		{
			first = start;
			last = to + end - start;
		}

		fireTableRowsUpdated(first, last);
	}