I'm in the process of creating a 2D game in which a player wanders through a maze.

I want to realize some kind of "darkness", even as simple as a transparent form around the player, surrounded by black, like this:

The problem I found with Swing is that, although it is possible, it means that you need to redraw everything that causes an annoying “flickering” effect every time this happens. Is there a way to make some kind of invoice or just a good way to do it at all in Swing? I'm not very experienced with GUI / visual stuff right now, so if possible I would stick with Swing.
EDIT: This is my background painting method, i.e. floor, walls and exit:
public final void paintBG(Graphics g){
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, getWidth(), getHeight());
for (int j = 0; j < this.height; j++, y += scaley) {
x = 20;
for (int i = 0; i < this.width; i++, x += scalex) {
if (!(maze[j][i].northwall.isBroken()))
{
g.drawImage(walltile, x, y, scalex, scaley / 5, null);
}
if (!(maze[j][i].eastwall.isBroken()))
{
g.drawImage(walltile, x + scalex, y, scalex / 5, scaley, null);
}
if (!(maze[j][i].southwall.isBroken())) {
g.drawImage(walltile, x, y + scaley, scalex, scaley / 5, null);
}
if (!(maze[j][i].westwall.isBroken())) {
g.drawImage(walltile, x, y, scalex / 5, scaley, null);
}
if ((j == mazeinfo.getTargetM()) && (i == mazeinfo.getTargetN())) {
g.drawImage(jeep, x + (scalex / 2), y + (scaley / 2), cx, cy, null);
g.setColor(Color.LIGHT_GRAY);
if (maze[j][i].northwall.isEdge()) {
g.fillRect(x, y, scalex, scaley / 4);
} else if (maze[j][i].eastwall.isEdge()) {
g.fillRect(x + scalex, y, scalex / 4, scaley);
} else if (maze[j][i].southwall.isEdge()) {
g.fillRect(x, y + scaley, scalex, scaley / 4);
} else if (maze[j][i].westwall.isEdge()) {
g.fillRect(x, y, scalex / 4, scaley);
}
}
}
}
}
paintPlayer paintEnemy , . , .