Quadro e tela crescem mais do que o especificado

Eu não tenho idéia do porque eu estou recebendo uma janela extra-grande, isso está me fazendo correr aros para caber meus sprites na janela do jogo. O construtor deve fazer com que todos os subcomponentes se encaixem uns nos outros, mas parece que há algum preenchimento extra na tela ou no quadro. Estou tendo dificuldade em descobrir qual é o culpado. O tamanho do meu quadro NÃO deve ser maior que 800x600 (decoração do SO não incluída, falando sobre os contêineres).

Panel: java.awt.Rectangle[x=0,y=0,width=810,height=610]
Frame: java.awt.Rectangle[x=0,y=0,width=816,height=638]
Canvas:java.awt.Rectangle[x=0,y=0,width=816,height=638]

Como você pode ver, os limites são maiores do que eu especifiquei.

A classe:

public class GameFrame {
private JFrame frame;
private JPanel panel;
private Canvas canvas;
private BufferStrategy bufferStrategy;
private Graphics2D g;
private int width;
private int height;

public GameFrame(Color bgColor) {
    this.width = GameEngine.GAMEDIMENSION[0]; // 800
    this.height = GameEngine.GAMEDIMENSION[1]; // 600
    this.frame = new JFrame();
    this.panel = (JPanel) frame.getContentPane();
    this.panel.setPreferredSize(new Dimension(width, height));
    this.panel.setLayout(null);
    this.panel.setBackground(bgColor);
    this.canvas = new Canvas();
    this.canvas.setBounds(0, 0, width, height);
    this.canvas.setIgnoreRepaint(true);
    this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.frame.pack();
    this.frame.setResizable(false);
    this.frame.setVisible(true);
    this.panel.add(canvas);
    this.canvas.createBufferStrategy(2);
    this.bufferStrategy = canvas.getBufferStrategy();
    this.g = (Graphics2D) bufferStrategy.getDrawGraphics();
    this.canvas.requestFocus();

}

O principal:

public static void main(String[] args) {
    GameFrame gf = new GameFrame(Color.black);
    System.out.println("Panel: " + gf.panel.getBounds());
    System.out.println("Frame: " + gf.frame.getBounds());
    System.out.println("Canvas:" + gf.frame.getBounds());

    for (int R = 0; R < 255; R++) {
        for (int B = 0; B < 255; B++) {
            for (int G = 0; G < 255; G++) {
                gf.g.setColor(Color.black);
                gf.g.fillRect(0, 0, gf.width, gf.height);
                gf.g.setColor(new Color(R, B, G));
                gf.g.fillRect(0, 0, gf.width, gf.height);
                gf.bufferStrategy.show();
            }
        }
    }

}

No principal eu tento fazer um loop de quadrados apenas para ver o efeito.

questionAnswers(1)

yourAnswerToTheQuestion