private void drawBackground(Graphics gc) {
		super.paintComponent(gc);

		Rectangle clip = gc.getClipBounds();
		Insets insets = getInsets();
		int top = insets.top;
		int bottom = getHeight() - (top + insets.bottom);
		Rectangle bounds = new Rectangle(insets.left, top, getWidth() - (insets.left + insets.right), bottom);
		boolean active = isFocusOwner();
		int first = getFirstRowToDisplay();
		int last = getLastRowToDisplay();
		boolean isPrinting = PrintUtilities.isPrinting(this);

		for (int rowIndex = first; rowIndex <= last; rowIndex++) {
			Row row = mModel.getRowAtIndex(rowIndex);
			if (!mModel.isRowFiltered(row)) {
				bounds.height = row.getHeight();
				if (bounds.y >= clip.y || bounds.y + bounds.height + (mDrawRowDividers ? 1 : 0) >= clip.y) {
					if (bounds.y > clip.y + clip.height) {
						break;
					}
					boolean rowSelected = !isPrinting && mModel.isRowSelected(row);
					if (!mDrawingDragImage || mDrawingDragImage && rowSelected) {
						gc.setColor(getBackground(rowIndex, rowSelected, active));
						gc.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
						if (mDrawRowDividers) {
							gc.setColor(mDividerColor);
							gc.drawLine(bounds.x, bounds.y + bounds.height, bounds.x + bounds.width, bounds.y + bounds.height);
						}
					}
				}
				bounds.y += bounds.height + (mDrawRowDividers ? 1 : 0);
			}
		}

		if (mDrawColumnDividers) {
			int x = insets.left;
			bottom += top;
			gc.setColor(mDividerColor);
			for (Column col : mModel.getColumns()) {
				if (col.isVisible()) {
					x += col.getWidth();
					gc.drawLine(x, top, x, bottom);
					x++;
				}
			}
		}

		if (!isPrinting && mDragFocus) {
			gc.setColor(getListBackground(true, true));
			bounds = getVisibleRect();
			int x = bounds.x;
			int y = bounds.y;
			int w = bounds.width - 1;
			int h = bounds.height - 1;
			gc.drawRect(x, y, w, h);
		}
	}