Flood fill algorithm in Java
Normally there's no need to specify the color to change from. You only need to specify the coordinates and leave it up to the flood fill routine to find out what color is at that location. I would define another method that is public, and make the recursive method a private implementation method. The public method would look up the color at the location and then call the private method.

public void fill(int x, int y, char newColor) {
    fill(x, y, newColor, pixels[x][y]);
}

private void fill(int x, int y, char newColor, char oldColor) {
    ...
}

You are not using oldColor correctly; you're overwriting the parameter value. The line:

oldColor = pixels[x][y];


should either be deleted or (better) amended to:

char color = pixels[x][y];


And the lines:

if (newColor == pixels[x][y]) return;
if (oldColor != pixels[x][y]) return;


should then be changed to use the color variable:

if (newColor == color) return;
if (oldColor != color) return;


Other than that, you have implemented the algorithm correctly.

It's worth noting that the way this algorithm uses recursion could lead to a stack overflow for a large block of color. Also, by dint of the +1 and -1, will end up calling fill() multiple times for each cell.