Quando redimensiono a janela, os desenhos desaparecem
public class Teste extends JPanel{
public void paint(Graphics g){
super.paint(g);
setBackground(Color.WHITE);
g.drawLine(30, 30, 10, 200);
}
}
public void desenhar(Graphics g, int erro){
if(erro == 1){
g.fillRect(324, 244, 200, 300);
}else if(erro == 2){
g.fillOval(300, 100, 80, 100);
}
}
public class NewClass extends JFrame implements ActionListener{
...
public void actionPerformed(ActionEvent e) {
if(bt == e.getSource()){
erro++;
teste = new Teste();
teste.desenhar(getGraphics(), erro);
}
}
Eu já vi aqui no fórum que tenho de usar BufferedImage mas não estou a conseguir, quando uso BufferedImage ele não desenha nada no inicio e ao carregar no botão tb não aparece nada…
Como poderei fazer?
O JPanel não guarda status do que foi desenhado. Então, você tem duas alternativas:
a) Redesenhar tudo, no método paintComponent. Esteja preparado para tudo ser redesenhado.
b) Desenhar tudo numa BufferedImage, e então desenhar essa imagem no paintComponent.
Você comentou que tentou fazer do jeito b). Pode postar o seu código para vermos qual é o problema?
Troquei uma coisita e já aparece no inicio, mas quando carrego no botão não desenha.
Então está assim.
public class Teste extends JPanel {
BufferedImage img = new BufferedImage(700, 700, BufferedImage.TYPE_INT_ARGB);
public void paintComponent(Graphics g) { // alterei aqui estava (Graphics2D g) agora pinta no inico
super.paintComponent(g);
setBackground(Color.WHITE);
g.fillOval(100, 100, 200, 200);
g.drawImage(img, 0, 0, null);
}
public void desenhar(int erro) { // isto não está a fazer nada
Graphics2D g = (Graphics2D) img.getGraphics().create();
if (erro == 1) {
g.fillRect(324, 244, 200, 300);
} else if (erro == 2) {
g.fillOval(300, 100, 80, 100);
}
}
public class NewClass extends JFrame implements ActionListener{
public NewClass(){
setLayout(new BorderLayout());
teste= new Teste();
add(teste, BorderLayout.CENTER);
add(botoes(), BorderLayout.SOUTH);
setSize(1400, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
...
public void actionPerformed(ActionEvent e) {
if(bt == e.getSource()){
erro++;
teste.desenhar(erro);
}
}
Seu método desenhar tem que avisar o resto do mundo que o painel mudou. Senão ele não se repintará:
public void desenhar(int erro) {
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(); //Informa que o painel deve ser redesenhado
}
Seu paintComponent também precisa fazer a cópia do contexto gráfico, antes de utiliza-lo:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics g2d = (Graphics2D)g.create(); //Faz a cópia
g2d.setBackground(Color.WHITE);
g2d.fillOval(100, 100, 200, 200);
g2d.drawImage(img, 0, 0, null);
g2d.dispose(); //libera a cópia
}