Graphics2D apaga desenhos

Estou criando uma aplicação que ao clicar em um botão seja desenhado algo. mas se a janela for redimensionada o desenho apaga. quero manter o desenho intacto.
Segue o código que esta dentro do botão.

Graphics2D g = (Graphics2D) jPanelViga.getGraphics();
    
    int altura, largura, x, y;
    g.setColor(Color.red);
    altura = 10;
    largura = 370;
    x = 100;
    y = 271;
    g.fillRect(x, y, largura, altura);

Sobrescreva o método paintComponent do seu jPanelViga e realize o desenho dentro desse método.

1 curtida

Sobrescrevi o método assim.

public class Desenhar extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g = (Graphics2D) jPanel1.getGraphics();
        g.drawLine(0, 0, 100, 100);
        repaint();
    }
}

e chamei ele assim

    Desenhar d = new Desenhar();
    d.paintComponent(getGraphics());

Mesmo problema.

Você não precisa chamar o paintComponent diretamente, ele é chamado automaticamente. Basta adicionar seu JPanel customizado num JFrame. Para forçar a atualização, você pode chamar o método repaint() ou revalidate() do JFrame ou do JPanel (não lembro qual deles é necessário, ou se precisa ambos).

Outra dica é iniciar sua janela usando a thread do Swing, que cuida da atualização de componentes na tela, dentre outras coisas. Exemplo:

import javax.swing.*;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class Janela extends JFrame{

  public Janela(){
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setPreferredSize(new Dimension(500, 500));
    setSize(getPreferredSize());
    getContentPane().add(new Painel());
  }

  public static void main(String args[]){
    javax.swing.SwingUtilities.invokeLater(new Runnable(){
      public void run(){
        new Janela().setVisible(true);
      }
    });
  }

  class Painel extends JPanel{
    protected void paintComponent(Graphics g){
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g.create();
      g2.drawLine(0,0, 100, 100);
      g2.dispose();
    }
  }
}

Abraço.

Dê uma lida nesses tutoriais:
http://pontov.com.br/site/index.php/java/48-java2d

Vão ser bem esclarecedores para você.