Desenho feito com Drawing apaga ao passar janela por cima [RESOLVIDO]

O código a seguir desenha uma linha na JTable, e ao clicar no botão mostra a caixa de diálogo.
O problema é que a caixa de diálogo apaga a linha desenhada na tabela… :frowning:

package jTable;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;

public class Table extends JTable {
	private static final long serialVersionUID = 1L;

	//Singleton
	private static Table tableInstance = new Table(10,2);
	public static Table getInstance() {return tableInstance;}
	private Table(int row, int col) {
		super(row,col);
	}
	
	//Desenha a linha na tabela
	public static void drawLine(){
		Graphics g = tableInstance.getGraphics();
		g.drawLine(0, 0, 200, 500);
	}
	
	@Override
	public void repaint(){
		super.repaint();
		if(tableInstance != null)
			drawLine();
	}
	
	//Cria jFrame
	private static JFrame jFrame;
	public static JFrame getJFrame() {
		if( jFrame == null ) {
			jFrame = new JFrame();
			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jFrame.setSize(new Dimension(300,300));
			jFrame.setLocationRelativeTo(null); //center
			jFrame.setVisible(true);
		}
		return jFrame;
	}

	public static void main(String[] args) {
		JFrame frame = getJFrame();
		Table tab = Table.getInstance();
		JButton btn = new JButton("Show dialog");
		
		//Configura o JButton para mostrar a caixa de diálogo
		btn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				drawLine();
				tableInstance.add(new JLabel("TEST"));
				JOptionPane.showInputDialog("Dialog box");
			}
		});

		frame.getContentPane().add(tab, BorderLayout.NORTH);
		frame.add(btn, BorderLayout.SOUTH);

	}
	
}

Qual o listener para “Ao apagar o desenho” ou “Ao arrastar uma janela por cima” eu chamar novamente o drawLine() ?

Encontrei este artigo, bem i:
http://java.sun.com/products/jfc/tsc/articles/painting/index.html

Mas ainda num resolveu…rs
Aparentemente vou ter que extender da classe Component, pois ela tem os métodos de redesenhar implementados. Estou fazendo as tentativas…

Continuo tentando…
Tentei herdar de Component, tentei sobrescrever o update, o repaint, o cell renderer, o cell editor… coloquei repaint em pontos estratégicos (hehe), mas o desenha ainda fica apagado ao passar outra janela por cima dele… :frowning:
continuo procurando…

Aceito qualquer dica! :slight_smile:

Meu método para pintar no meu programa original estava chamando outro método para pintar um ícone na célula da jTable:

	private static void paintIcone(Graphics g) {
		Rectangle rect = g.getClipBounds();
		int x = rect.x;
		int y = rect.y;
		g.drawLine( x+26, y+26, x+26,y+34 ); // |
		g.drawLine( x+34, y+26, x+34, y+34 ); // | |
	}

Enxergaram o problema?
Não sei exatamente por que, mas eu trabalhar com o ClipBounds, que achei que era necessário, na verdade era o que estava errado…

Assim funcionou legal:

	private static void paintIcone(Graphics g) {
		g.drawLine( 26, 26, 26, 34 ); // |
		g.drawLine( 34, 26, 34, 34 ); // | |
	}

complicações de iniciante… :smiley: