Desenho some quando abre a tela'

Pessoal estou com um problema, o desenho some quando abre a tela.
Pode me ajudar ?

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Canvas;

public class TelaDesenho extends JFrame {

private JPanel contentPane;
private Canvas canvas;
private static TelaDesenho singleton;

/**
 * Create the frame.
 */
public TelaDesenho() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 450, 300);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(null);
			
	getCanvas().setBounds(0, 0, 434, 261);
	contentPane.add(getCanvas());	
}

public Canvas getCanvas() {
	
	if(canvas == null) {
		
		canvas = new Canvas();
	}
	return canvas;
}

public static TelaDesenho getSingleton() {
	
	if(singleton == null) {
		
		singleton = new TelaDesenho();
	}
	return singleton;
}

}

import java.awt.Canvas;
import java.awt.Graphics;

public class Desenho {

private static Desenho singleton;

public void desenhar() {
	
	TelaDesenho td = TelaDesenho.getSingleton();
	Canvas c = td.getCanvas();
	Graphics g = c.getGraphics();
	g.fillRect(0, 0, 100, 100);
}

public static Desenho getSingleton() {
	
	if(singleton == null) {
		
		singleton = new Desenho();
	}
	return singleton;
} 

public class Principal {

public static void main(String[] args) {
	
	TelaDesenho td = TelaDesenho.getSingleton();
	td.setVisible(true);
	Desenho d = Desenho.getSingleton();	
	d.desenhar();						
}

}

Tenho a impressão que você não fica repintando a tela, para atualizá-la, deve ser esse o problema. Experimenta sobrescrever “paintComponent(Graphics g)” como (eu acho) que quase todo mundo faz.

Tenha em mente também que o Swing está sendo abandonado para que seja usado o JavaFX em seu lugar, se você está começando a aprender sugiro que vá aprender o JavaFX.

Para testar se é um problema de falta de repintar, você pode fazer essa gambiarra (só pra testar):

public static void main(String[] args) {
	
	TelaDesenho td = TelaDesenho.getSingleton();
	td.setVisible(true);
	Desenho d = Desenho.getSingleton();	
	while(true) {
	    	d.desenhar();						
	    	Thread.sleep(100); //coloque num bloco try/catch
	}
}
1 curtida

Eu fiz desse jeito

public static void main(String[] args) {

	TelaDesenho td = TelaDesenho.getSingleton();
	td.setVisible(true);
	try {
		Thread.sleep(300);
		Desenho d = Desenho.getSingleton();	
		d.desenhar
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}												
}

Usar uma Thread para fazer a janela se repintar não funciona bem, porque componentes Swing não são thread-safe e também não foram feitos para ter chamadas de desenho feitas externamente.

Faça como o Douglas-Silva sugeriu e sobrescreva o método paint do JFrame ou paintComponent num JPanel personalizado. Recomendo a leitura:

Abraço.