Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在透明窗口上绘制非透明内容_Java_Swing_Graphics_Transparency - Fatal编程技术网

Java 在透明窗口上绘制非透明内容

Java 在透明窗口上绘制非透明内容,java,swing,graphics,transparency,Java,Swing,Graphics,Transparency,所以我试着在透明的窗户上画一个红色的椭圆形。后来我想对多个形状做一些更复杂的事情,所以使用SetWindowsShape不是我想要的。这是我目前使用的代码: import java.awt.*; import javax.swing.*; public class JavaDock extends JFrame{ public JavaDock(){ super("This is a test"); setSize(400, 150);

所以我试着在透明的窗户上画一个红色的椭圆形。后来我想对多个形状做一些更复杂的事情,所以使用SetWindowsShape不是我想要的。这是我目前使用的代码:

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

public class JavaDock extends JFrame{

    public JavaDock(){
        super("This is a test");

        setSize(400, 150);

        setUndecorated(true);
        getContentPane().setLayout(new FlowLayout()); 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         JPanel panel = new JPanel()  
         {  
            public void paintComponent(Graphics g)  
            {  
               Graphics2D g2d = (Graphics2D) g.create();
               g2d.setComposite(AlphaComposite.Clear);
               g.setColor(Color.red);  

               //Draw an oval in the panel  
               g.fillOval(10, 10, getWidth() - 20, getHeight() - 20);  
            }  
         }; 

        panel.setOpaque(false);
        setGlassPane(panel);  
        getGlassPane().setVisible(true);
        com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.5f);
        setVisible(true);
    }

     protected void paintComponent(Graphics g) {

        }

     public static void main(String[] args){
         JavaDock jd = new JavaDock();
     }
}
代码看起来不太正确。我会尝试:

Graphics2D g2d = (Graphics2D)g; 
g2d.setComposite(AlphaComposite.Clear); 
g2d.setColor(Color.red);   
g2d.fillOval(10, 10, getWidth() - 20, getHeight() - 20);   
或者直接使用:

g.setColor(Color.red);   
g.fillOval(10, 10, getWidth() - 20, getHeight() - 20);   

您正在对窗口应用全局透明度,因此其中的所有内容自然至少与全局值一样透明。您可能需要每像素半透明。替换

com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.5f);


这只留下你的椭圆形可见,它将是完全不透明的。可以找到更多信息

我不确定我是否理解这个问题。我看到红色的椭圆形。我没有接触到任何装备,所以也许这就是不同之处。确实如此。窗户应该是透明的,但椭圆形必须是不透明的。仍然在寻找一个好的解决方案。所有这些都不起作用,奇怪的是,使用g而不是g。create()使椭圆从黑色变为红色。这一变化给了我以下信息:线程“main”中的异常java.lang.IllegalArgumentException:装饰窗口的效果不受支持。奇怪的是,您使用的是什么平台和JRE版本?我粘贴了您的代码,只是更改了行(WinXP上的Sun JDK 1.6.018)。
com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.5f);
com.sun.awt.AWTUtilities.setWindowOpaque(this, false);