首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整透明JWindow大小时闪烁

调整透明JWindow大小时闪烁
EN

Stack Overflow用户
提问于 2021-02-11 21:03:58
回答 1查看 67关注 0票数 1

我试图用Java创建一个透明的窗口,并且我已经创建了这个窗口。问题是当我调整窗户的尺寸时,它会闪烁。我试着把背景改为不透明的颜色。这解决了问题,但我希望窗户是透明的。我也试过

Toolkit.getDefaultToolkit().setDynamicLayout(true);

Toolkit.getDefaultToolkit().getDesktopProperty("awt.dynamicLayoutSupported");

System.setProperty("sun.awt.noerasebackground", "true");

但没有结果。我尝试过JWindow.setBounds而不是JWindow.setSize,但这也没有效果。

下面是我用来生成窗口的代码

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JPanel;
import javax.swing.JWindow;

public class GlassWindow extends JPanel {
    // RIGHT CLICK TO CLOSE
    private static final long serialVersionUID = 1L;
    private JWindow jwindow = new JWindow();
    private boolean programCalledRender, shouldClose;
    private int edges = 8;
    private Color background = new Color(255, 100, 0, 100);
    
    public GlassWindow() {
        int width = 1000, height = 750;
        this.setOpaque(false);
        this.setSize(width, height);
        jwindow.setSize(width, height);
        jwindow.setBackground(new Color(0, 0, 0, 0));
        jwindow.setContentPane(this);
        jwindow.setLocationRelativeTo(null);
        jwindow.setVisible(true);
        jwindow.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                if(e.getButton() == MouseEvent.BUTTON3) System.exit(0);
            }
            public void mouseEntered(MouseEvent e) {}
            public void mouseExited(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
        });
        new Thread(() -> run()).start();
    }
    public void render() {
        programCalledRender = true;
        this.repaint();
    }
    private void run() {
        int setTPS = 20, setFPS = 60;
        long lastTime = System.nanoTime();
        double delta = 0, frameDelta = 0;
        while(true) {
            if(shouldClose) break;
            long now = System.nanoTime();
            delta += (now-lastTime)/(1000000000/(double)setTPS);
            frameDelta += (now-lastTime)/(1000000000/(double)setFPS);
            lastTime = now;
            while(delta > 0) {
                tick();
                delta--;
            }
            while(frameDelta > 0) {
                render();
                frameDelta--;
            }
        }
    }
    private void tick() {
        
    }
    @Override
    public void paintComponent(Graphics g) {
        if(!programCalledRender) return;
        super.paintComponent(g);
        int newWidth = MouseInfo.getPointerInfo().getLocation().x+20-jwindow.getX();
        if(newWidth != jwindow.getWidth()) {
            jwindow.setSize(newWidth, jwindow.getHeight());
        }
        if(background != null) {
            g.setColor(background);
            g.fillRect(edges, edges, jwindow.getWidth()-edges*2, jwindow.getHeight()-edges*2);
        }
        g.setColor(new Color(0, 0, 0, 100));
        for(int i = 0; i <= edges; i++) {
            g.drawRect(i, i, jwindow.getWidth()-i*2, jwindow.getHeight()-i*2);
        }
    }
    
    public static void main(String[] args) {
        new GlassWindow();
    }
}

如何在调整JWindow大小时防止闪烁?

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-20 01:07:35

正如@camickr所建议的,我应该而不是调整render方法中的窗口大小。

所以为了停止闪烁我移除

代码语言:javascript
复制
      int newWidth = MouseInfo.getPointerInfo().getLocation().x+20-jwindow.getX();
        if(newWidth != jwindow.getWidth()) {
            jwindow.setSize(newWidth, jwindow.getHeight());
        }

paintComponent(Graphics g)方法。再加上

代码语言:javascript
复制
        jwindow.addMouseMotionListener(new MouseMotionListener() {
            public void mouseDragged(MouseEvent e) {}
            public void mouseMoved(MouseEvent e) {
                int newWidth = MouseInfo.getPointerInfo().getLocation().x+20-jwindow.getX();
                if(newWidth != jwindow.getWidth()) {
                    jwindow.setSize(newWidth, jwindow.getHeight());
                }
            }
        });

构造函数GlassWindow()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66162804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档