gpt4 book ai didi

java - 半透明 JPanel 在 Linux 中不清除背景/显示背景伪像

转载 作者:太空狗 更新时间:2023-10-29 11:36:18 26 4
gpt4 key购买 nike

我目前正在开发一个应用程序,它需要选择屏幕区域的功能。我想到了创建一个透明、未修饰的全屏 JFrame,并在其中添加一个半透明、非不透明的 JPanel,其中绘制了半透明的深色背景和选区。

虽然这个想法(和代码)在 Windows 上运行良好,但在 linux 上就不一样了,JPanel 的背景在调用 repaint() 时似乎没有被清除(即使我告诉它通过various methods) - 在每个重绘方法上,背景和组件变得越来越暗,等等。

这是 MVCE:

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

public class ExampleFrame extends JFrame{


private ExamplePanel selectionPane;

public ExampleFrame(){
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
ExampleFrame.this.dispatchEvent(new WindowEvent(ExampleFrame.this, WindowEvent.WINDOW_CLOSING));
}
}
});


this.setExtendedState(JFrame.MAXIMIZED_BOTH);

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(screenSize);

this.setUndecorated(true);

this.setBackground(new Color(255, 255, 255, 0));

populate();

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setType(Window.Type.UTILITY);
this.setVisible(true);
}

private void populate(){
this.selectionPane = new ExamplePanel();
this.setContentPane(selectionPane);
}

public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ExampleFrame();
}
});
}

public static class ExamplePanel extends JPanel{

private static Color bg = new Color(0,0,0,0.5f);

private int sx = -1, sy = -1, ex = -1, ey = -1;

public ExamplePanel(){

MouseAdapter mouseAdapter = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
sx = sy = ex = ey = -1;

sx = e.getX();
sy = e.getY();
repaint();
}

@Override
public void mouseReleased(MouseEvent e) {
ex = e.getX();
ey = e.getY();
repaint();
}

@Override
public void mouseDragged(MouseEvent e) {
ex = e.getX();
ey = e.getY();
repaint();
}
};

this.addMouseListener(mouseAdapter);
this.addMouseMotionListener(mouseAdapter);

this.setDoubleBuffered(false);
this.setOpaque(false);
this.setBackground(bg);
}

@Override
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g.create();

g2.setComposite(AlphaComposite.Clear);
g2.setBackground(new Color(255, 255, 255, 0));
g2.fillRect(0, 0, getWidth(), getHeight());
//g2.clearRect(0, 0, getWidth(), getHeight()); //neither of them work

g2.setComposite(AlphaComposite.Src.derive(.5f));
g2.setPaint(getBackground());
g2.fillRect(0, 0, getWidth(), getHeight());

g2.setComposite(AlphaComposite.Src.derive(1f));
g2.setPaint(Color.WHITE);
g2.drawString("Press Escape to exit", 10, 20);

if(!(sx == -1 || sy == -1 || ex == -1 || ey == -1)){

int asx = Math.min(sx, ex);
int asy = Math.min(sy, ey);

int w = Math.abs(ex - sx);
int h = Math.abs(ey - sy);

g2.setComposite(AlphaComposite.Src);
g2.setPaint(new Color(255, 255, 255, 0));
g2.fillRect(asx, asy, w, h);

g2.setPaint(new Color(0, 0, 0, 1));
g2.fillRect(asx, asy, w, h);

g2.setComposite(AlphaComposite.SrcOver);
g2.setStroke(new BasicStroke(2));
g2.setPaint(new Color(1, 1, 1, 0.15f));
g2.drawRect(asx-1,asy-1, w+2, h+2);
}
}
}

}

关于可能导致此问题的任何想法?或者这可能是 Linux 上 Java 的错误?我已经在 Windows 10 和 Ubuntu 14.04 LTS 以及使用 KDE gui 运行的未知版本的 Arch Linux 下测试了这个(由 friend 测试)

编辑:还在 OSX(Yosemite 和 El capitan)下进行了测试,两者都运行良好。

最佳答案

this.setBackground(new Color(255, 255, 255, 0));

如果你想要一个完全透明的组件,那么只需使用:

component.setOpaque( false );

这会告诉 Swing 寻找父组件并首先绘制它,这样您就不会得到绘制工件。

private static Color bg = new Color(0,0,0,0.5f);

如果您想要半透明背景,则需要进行自定义编码,因为 Swing 不支持。

查看 Backgrounds With Transparency有关此主题和几个解决方案的更多信息。

一种是使用如下代码进行您自己的自定义绘画:

JPanel panel = new JPanel()
{
protected void paintComponent(Graphics g)
{
g.setColor( getBackground() );
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
};

另一个解决方案是一个可重用的类,它可以与任何组件一起使用,因此您不需要自定义每个组件。 panel.setOpaque(false);//parent 的背景会先被绘制 panel.setBackground( 新颜色(255, 0, 0, 20) ); frame.add(面板);

关于java - 半透明 JPanel 在 Linux 中不清除背景/显示背景伪像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35094421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com