Зачем вам использовать Canvas в приложении, которое уже использует Swing (JFrame - это Swing)?
BufferedImage image = new BufferedImage(blah....)
Graphics2D gfx = image.createGraphics();
JButton but = new JButton("Click me");
but.update(gfx);
Но это действительно очень уродливо!
Почему бы вам невзять JPanel?На самом деле, вы можете переписать метод рисования, просто вызвав метод update, чтобы панель не очищалась (но я давно играл с Java).Затем вы можете использовать Graphics2D, который вы получаете в качестве аргумента в методе update, для рисования чего-либо, и это позволяет вам даже добавлять свои собственные кнопки и другие вещи к нему ...