JPanel 不能很好地使用透明 JFrame 重新绘制



我正在尝试通过透明的JFrame重新粉刷JPanel,但它可以让先前的重新点标记:

以前的重新涂片保持显示

我知道这是一个已知的问题,并且已经发布了一个类似的问题,但是答案只解释了为什么它不起作用,而他们不提供解决方案。

任何人都可以更改代码或添加一些,因此会产生所需的效果?(在透明背景上跟随鼠标的十字(

我不想为桌面拍照,然后将其绘制在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);
    }
}

由于没有重量级顶级组件,因此您需要自己管理背景。

在Super.paintcomponent之后,将其添加到您的PaintComponent方法中:

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

最新更新