Tem vários erros no código que você me passou:
- No ActionListener do seu botão, você faz:
teste = new Teste();
Isso cria um painel novo. Logo, você não está chamando o método desenhar no mesmo painel que você adicionou no JFrame.
- Na sua classe Teste, o construtor do BufferedImage está com os dois primeiros parâmetros com valores iguais a 1:
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Como você espera desenhar uma forma qualquer em apenas 1 pixel?
Segue o código todo corrigido:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class NewClass extends JFrame {
private JButton btJogar, btNovo;
private JPanel panel;
private Teste teste;
public NewClass() {
setLayout(new BorderLayout());
teste = new Teste();
add(teste, BorderLayout.CENTER);
add(botoes(), BorderLayout.SOUTH);
setTitle("Teste");
setSize(1400, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public JPanel botoes() {
panel = new JPanel();
panel.setBackground(Color.red);
btJogar = new JButton("OK");
btJogar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
desenhar();
}
});
btNovo = new JButton("Novo");
btNovo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
novo();
}
});
panel.add(btJogar);
panel.add(btNovo);
return panel;
}
int erro = 0;
public void desenhar() {
erro++;
teste.desenhar(erro);
}
public void novo() {
}
public static void main(String[] args) {
new NewClass();
}
}
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class Teste extends JPanel {
BufferedImage img = null;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics g2d = g.create(); //Faz a cópia
g2d.fillOval(100, 100, 200, 200);
g2d.drawImage(img, 0, 0, null);
g2d.dispose(); //libera a cópia
}
public void desenhar(int erro) {
if (img == null) {
img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
}
Graphics2D g = img.createGraphics();
if (erro == 1) {
g.fillRect(324, 244, 200, 300);
} else if (erro == 2) {
g.fillOval(300, 100, 80, 100);
}
g.dispose();
repaint();
}
}