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 1Apenas 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 3Parece 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,