Quando um JPanel pinta (ou repinta) seus componentes filhos?

Eu tenho um JButton que é pintado usando um delegado de interface do usuário personalizado (CustomButtonUI estende BasicButtonUI). O método paint () do CustomButtonUI desenha o botão com cantos arredondados "antialias", para tornar a aparência o mais "suave" possível.

De alguma forma, as bordas "antialias" do botão desaparecem cada vez que eu arrasto o mouse sobre o botão. Isso faz com que as bordas dos botões pareçam "pixelizadas". No entanto, quando adiciono uma linha de código para repintar o pai do botão, o antialiasing entra em ação mesmo quando eu arrasto o mouse sobre o botão.

Agora, minha pergunta se refere a se essa é uma boa ideia? Afinal, repintei o componente pai a partir de um componente filho. Gostaria de saber se isso leva a um ciclo de repúdio? Se os pais tentam repintar seus filhos e os filhos tentam repintar seus pais - então eu assumo que estamos falando de um loop.

Anexei meu código como referência. Quaisquer comentários são muito bem-vindos!

public class JCustomButtonUI extends BasicButtonUI {

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);

        AbstractButton b = (AbstractButton) c;
        b.setBorderPainted(false);
    }

    @Override
    public void paint(Graphics g, JComponent c) {

        //Cast the Graphics instance to a Graphics2D instance.
        Graphics2D g2d = (Graphics2D) g;
        JButton b = (JButton) c;

        //Repaint parent component to make sure that we get "antialiased"
        //edges.
        b.getParent().repaint();

        //Get the component's height and width.
        int w = (int) g.getClipBounds().getWidth();
        int h = ((int) g.getClipBounds().getHeight());

        //Make sure the button is drawn with "antialiased" edges.
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.GRAY);
        g2d.fillRoundRect(0, 0, w, h, w, h);       
    }
}
Atualização 1

Apenas para ilustrar o alias e a borda antialias, dê uma olhada nas duas fotos abaixo. Quando i (do método paint () do ButtonUI) invoca manualmente o método de repintura do JPanel pai, todas as bordas são perfeitamente antialias o tempo todo. No entanto, quando eu não invoco manualmente o método de repintura do JPanel pai, as bordas não são mais suavizadas quando o mouse é colocado sobre o botão.

Atualização 2

Eu compartilhei o "componente" inteiro, que consiste em um JPanel, um JSlider e alguns JButtons no Snipt. Por favor, obtenha-ohttp://snipt.org/wnllg.

Atualização 3

Parece que eu consegui fazê-lo funcionar. Em vez de pintar o plano de fundo do JPanel no método paintComponent (), criei um JCustomPanelUI que eu instalei no JPanel. Eu não acho que essa foi a solução em si, mas em vez de usar largura e altura da instância Graphics, tentei usar widht e height do JPanel. Não sei ao certo por que as coisas dão errado quando uso largura e altura da instância de gráficos. Eu pensei que a largura e a altura da instância Graphics já estavam "preparadas" com relação às dimensões do componente JPanel. Você pode dar uma olhada no componente final aqui:http://snipt.org/wnlli,

questionAnswers(5)

yourAnswerToTheQuestion