JPanel плохо перерисовывается с помощью прозрачного JFrame - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь перекрасить JPanel поверх прозрачного JFrame, но он позволяет пометить предыдущую перерисовку:

предыдущий перекрас продолжает показывать

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

Может ли кто-нибудь внести изменения в код или добавить их, чтобы они дали желаемый эффект? (крест, который следует за мышью на прозрачном фоне)

Я не хочу делать снимок рабочего стола и рисовать его в JPanel.

Код следующий

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

final class Transparency extends JFrame{
    private NewPanel np;

    Transparency(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setUndecorated(true);
        setLocation(200,200);
        setBackground(new Color(0,0,0,0));

        np = new NewPanel();
        setContentPane(np);

        pack();
        setVisible(true);
    }

    public static void main(String []args){
        Transparency li = new Transparency();
    }
}

final class NewPanel extends JPanel{
    private Point p = new Point(0,0);
    private final int length = 25;

    NewPanel(){
        setPreferredSize(new Dimension(400,400));
        setOpaque(false);
        addMouseMotionListener(new MouseAdapter(){
            public void mouseMoved(MouseEvent e){
                p = e.getPoint();
                repaint();
            }
        });
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        g.setColor(Color.GREEN);
        g.drawLine(p.x-length,p.y,p.x+length,p.y);
        g.drawLine(p.x,p.y-length,p.x,p.y+length);

        g.setColor(Color.WHITE);
        g.drawRect(0,0,399,399);
    }
}

1 Ответ

0 голосов
/ 27 мая 2019

Так как нет тяжелого компонента верхнего уровня, вам нужно будет самостоятельно управлять фоном.

Добавьте это в свой метод paintComponent, сразу после super.paintComponent:

g.clearRect(0, 0, getWidth(), getHeight());
...