当前位置: 首页 > 知识库问答 >
问题:

透明JFrame不清楚重新粉刷

羊城
2023-03-14

当我尝试重新绘制透明窗口并在其上绘制矩形时,之前的矩形将保留。目标是通过单击并移动鼠标在屏幕上选择一个区域。如果你移动鼠标一会儿,它会看起来像这样

通过去除透明度,效果很好。

我尝试了在Stack Overflow上找到的关于这个主题的所有内容,但我无法让它在Windows和Linux上运行。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

public class Main {
    private JFrame frame;
    private boolean pressing = false;
    private boolean selected = false;
    private ScreenSelectPanel p;

    public Main() {
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        frame = new JFrame("ScreenSelection");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(dim);
        frame.setUndecorated(true);

        frame.setContentPane(p = new ScreenSelectPanel());
        registerListeners();

        frame.getContentPane().setBackground(new Color(255, 255, 255,    0));
        frame.setBackground(new Color(255, 255, 255, 0));
        frame.setLayout(new BorderLayout());

        frame.setAlwaysOnTop(true);
        frame.setVisible(true);
    }

    private void registerListeners() {
        p.setFocusable(true);
        p.requestFocusInWindow();

        p.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (selected)
                    return;
                setLoc(e);
                p.repaint();

            }

            @Override
            public void mouseMoved(MouseEvent e) {
                if (selected)
                    return;
                setLoc(e);
                if (!pressing)
                    setStartLoc(e);
                p.repaint();
            }
        });
        p.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                setLoc(e);
                setStartLoc(e);
                p.repaint();
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                setLoc(e);
                setStartLoc(e);
                p.repaint();

            }
        });
    }

    public void setStartLoc(MouseEvent e) {
        p.mouseStartX = e.getX();
        p.mouseStartY = e.getY();
    }

    public void setLoc(MouseEvent e) {
        p.mouseX = e.getX();
        p.mouseY = e.getY();
    }

    public static void main(String[] args) {
        new Main();
    }
}
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;

public class ScreenSelectPanel extends JPanel {
    public int mouseX = 0;
    public int mouseY = 0;
    public int mouseStartX = 0;
    public int mouseStartY = 0;

    private Color borderColor;

    public ScreenSelectPanel() {
        setOpaque(false);
        borderColor = Color.BLACK;
    }

    public void setBorderColor(Color c) {
        this.borderColor = c;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(borderColor);
        Rectangle rect = new Rectangle();
        rect.setFrameFromDiagonal(new Point2D.Float(mouseStartX, mouseStartY), new Point2D.Float(mouseX, mouseY));
        Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0);
        g2d.setStroke(dashed);
        g2d.drawRect(rect.x, rect.y, rect.width, rect.height);

        g2d.dispose();
    }

}

谢谢:)

共有1个答案

慕容嘉荣
2023-03-14

不能对Swing组件使用透明度。透明背景会导致这些类型的绘画问题。Swing组件是不透明或非不透明的。

查看具有透明度的背景以获取有关此问题的更多信息。但是,在此原因中,这不是问题,因为您正在尝试在摆动面板上使用完全透明。

当我试图重新绘制一个透明窗口,并在其上绘制一个矩形时,上一个矩形将保持不变。

您发布的代码可以执行任何操作(至少在Windows上)。当您将帧设置为完全透明时,Swing 将不再处理 MouseEvents,而是由框架下方的应用程序处理。

我对您的代码进行了以下更改,它似乎对我有用:

//frame.getContentPane().setBackground(new Color(255, 255, 255,    0));
//frame.setBackground(new Color(255, 255, 255, 0));
frame.setBackground(new Color(255, 255, 255, 10));
 类似资料:
  • 问题内容: 我只是将应用程序主题设置为Synthetica Alu Oxide,但由于某些原因,JFrame不会重新绘制,而另一个Synthetica主题将重新绘制JFrame。 这就是我的样子。 http://i.imgur.com/SOBDTs4.png 这就是它的样子。 http://www.jyloo.com/images/screenshots/syntheticaAluOxide/de

  • 问题内容: 如何使JFrame透明?我想使我的JFrame透明。当我的JFrame位于顶部时,用户应该会看到背景。 问题答案: 如果您对使用受限的API类没有异议,则可以使用该类的类和方法来实现。这里和这里是有关如何使用它的教程?而这里是使用Java本地接入的版本。 代码示例

  • 嗨,我正在学习Selenium&我不太清楚上面两个函数是如何工作的:问题陈述: 我有一个练习作业:转到http://the-internet.herokuapp.com/ 单击链接>多个窗口一个窗口打开>单击>>单击此处另一个窗口打开>>从该窗口获取文本并打印,然后返回http://the-internet.herokuapp.com/Windows并打印文本。 流程:http://the-int

  • 我有一个badtokenexception的报告,尽管我尝试了任何事情,但我无法复制它,对我来说也不清楚它是如何发生的。 BadTokenException(@Android.view.viewrootimpl:setView:575)通过(@Android.view.WindowmanagerGlobal:AddView:272)完整跟踪:Android.view.Windowmanager$B

  • #klem1,#klem2 { opacity:0.4; filter:alpha(opacity=40); /* For IE8 and earlier */ } #klem1:hover,#klem2:hover { opacity:1.0; filter:alpha(opacity=100); /* For IE8 and earlier */ } div.background { widt

  • 我是java图形新手,目前正在开发一款游戏。从本质上讲,有上升的泡沫,用户必须通过移动鼠标来弹出它们。 我已经在JFrame上制作了一个动画,我需要在上面为MouseMotionListener添加一个JPanel。然而,当我将JPanel添加到JFrame的顶部时(即使setOpaque设置为false),它仍然不能让我看到下面的动画。你可以在下面看到我的代码。如果你发现编码错误,请告诉我。 我