У меня проблема. Я пытаюсь создать компонент «оповещения», который я могу отобразить в JFrame. Это предупреждение имеет полупрозрачный фон (непрозрачность 70%, белый) с любым простым количеством кнопок J на нем. Сам фон имеет закругленные углы, поэтому я создал пользовательский компонент.
При рендеринге этого предупреждения появляются артефакты: на кнопке, изначально выбранной, не отображается фон предупреждения. При перемещении моей мыши по кнопкам создается впечатление, что текст кнопок рисуется в двух местах без причины.
Снимки экрана с артефактами (верх = начальный рендер, низ = движущаяся мышь):
![Initial artifact](https://i.stack.imgur.com/fFqQU.png)
![Moving mouse around](https://i.stack.imgur.com/aHQMP.png)
Код, который вызывает эти проблемы:
public class Test {
public static void main(String[] args) {
MyRoundedTransparentBackground background = new MyRoundedTransparentBackground();
background.setSize(200, 200);
background.setLocation(100, 100);
background.setLayout(new GridBagLayout());
JPanel spacer = new JPanel();
spacer.setBackground(new Color(0, 0, 0, 0));
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = 1;
c.gridheight = 1;
c.weighty = 1;
background.add(spacer, c);
JButton button1 = new JButton("Hi there");
JButton button2 = new JButton("Bye ...");
button1.setBackground(new Color(0, 0, 0, 0));
button1.setFocusPainted(false);
button1.setBorderPainted(false);
button2.setBackground(new Color(0, 0, 0, 0));
button2.setFocusPainted(false);
button2.setBorderPainted(false);
c.weighty = 0;
c.gridy = 1;
background.add(button1, c);
c.gridx = 1;
background.add(button2, c);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setLocation(2000, 100);
frame.setLayout(null);
frame.getContentPane().setBackground(Color.red);
frame.add(background);
frame.setVisible(true);
}
private static class MyRoundedTransparentBackground extends JComponent {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(new Color(1f, 1f, 1f, 0.7f));
g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 15, 15);
}
}
Может ли кто-нибудь помочь мне выяснить, в чем проблема, и дать потенциальное решение для достижения желаемого поведения?