簡體   English   中英

JPanel使用透明JFrame不能很好地重繪

[英]JPanel doesn't repaint well using transparent 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);
    }
}

由於沒有重量級的頂級組件,您需要自己管理背景。

將它添加到paintComponent方法中,就在super.paintComponent之后:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM