Артефакты рендеринга Java при добавлении кнопок в полупрозрачный JPanel - PullRequest
0 голосов
/ 18 марта 2019

У меня проблема. Я пытаюсь создать компонент «оповещения», который я могу отобразить в JFrame. Это предупреждение имеет полупрозрачный фон (непрозрачность 70%, белый) с любым простым количеством кнопок J на ​​нем. Сам фон имеет закругленные углы, поэтому я создал пользовательский компонент.

При рендеринге этого предупреждения появляются артефакты: на кнопке, изначально выбранной, не отображается фон предупреждения. При перемещении моей мыши по кнопкам создается впечатление, что текст кнопок рисуется в двух местах без причины.

Снимки экрана с артефактами (верх = начальный рендер, низ = движущаяся мышь):

Initial artifact

Moving mouse around

Код, который вызывает эти проблемы:

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);
        }

    }

Может ли кто-нибудь помочь мне выяснить, в чем проблема, и дать потенциальное решение для достижения желаемого поведения?

...