Рисование непрозрачного контента в прозрачном окне - PullRequest
2 голосов
/ 31 октября 2010

Итак, я пытаюсь нарисовать сплошной красный овал на прозрачном окне. Позже я хочу сделать что-то более сложное с несколькими формами, поэтому использование setWindowShape - это не то, что я ищу. Это код, который я использую до сих пор:

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();
     }
}

Ответы [ 2 ]

4 голосов
/ 05 ноября 2010

Вы применяете глобальную прозрачность к своему окну, поэтому, естественно, все в нем будет, по крайней мере, таким же прозрачным, как и глобальное значение.Вы, вероятно, хотите полупрозрачность на пиксель.Замените

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

на

com.sun.awt.AWTUtilities.setWindowOpaque(this, false);

Это оставит видимым только ваш овал, и он будет полностью непрозрачным.Больше информации можно найти в этом уроке

0 голосов
/ 31 октября 2010
Graphics2D g2d = (Graphics2D) g.create(); 
g2d.setComposite(AlphaComposite.Clear); 
g.setColor(Color.red);   
g.fillOval(10, 10, getWidth() - 20, getHeight() - 20);   

Код выглядит не совсем правильно. Я бы попробовал:

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);   
...