JFrame Przezroczyste tło

0

Witam
Od pewnego czasu nie mogę sobie poradzić z aplikacja która pisze a że nie jestem wybitnie zdolny z javą napotkałem problem który nie mogę przeskoczyć

Nie wiem jak zrobić JFrame aby miało przezroczyste tło na którym będzie można umieścić komponenty nie przezroczyste i przyciski. Chodzi mi mniej więcej o taki efekt jak na przykładowej fotografii
przykład:
user image
1- JFrame
2-przyciski zamykajcie aplikacje /minimalizacja
3- przycisk JButton
4- Własne komponenty

Założenia co do projektu:
Aplikacja stawiana na wydajność małe obciążenie systemu, najlepiej w wersji java 1.6

Proszę o pomoc w rozwiązaniu, bardzo bym prosił o jakiś przykłąd

0

Ok super da się zrobić to co oczekuje :) . Tylko że z tego co się orientuje to ten efekt ( z przezroczyste tło tylko, nie elementy na nim) tylko w JDK 7 Equivalent , a ja bym wolał w JDK 6. Czy jest to możliwe ?

0

więc jak przerobić poniższy przykład z java 1.7 na java 1.6 ??

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

import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class GradientTranslucentWindowDemo extends JFrame {
    public GradientTranslucentWindowDemo() {
        super("GradientTranslucentWindow");

        setBackground(new Color(0,0,0,0));
        setSize(new Dimension(300,200));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                if (g instanceof Graphics2D) {
                    final int R = 240;
                    final int G = 240;
                    final int B = 240;

                    Paint p =
                        new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0),
                            0.0f, getHeight(), new Color(R, G, B, 255), true);
                    Graphics2D g2d = (Graphics2D)g;
                    g2d.setPaint(p);
                    g2d.fillRect(0, 0, getWidth(), getHeight());
                }
            }
        };
        setContentPane(panel);
        setLayout(new GridBagLayout());
        add(new JButton("I am a Button"));
        add(new JSlider(1, 10));
    }

    public static void main(String[] args) {
        // Determine what the GraphicsDevice can support.
        GraphicsEnvironment ge = 
           GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        boolean isPerPixelTranslucencySupported = 
            gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);

        //If translucent windows aren't supported, exit.
        if (!isPerPixelTranslucencySupported) {
            System.out.println(
                "Per-pixel translucency is not supported");
                System.exit(0);
        }

        JFrame.setDefaultLookAndFeelDecorated(true);

        // Create the GUI on the event-dispatching thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GradientTranslucentWindowDemo gtw = new
                    GradientTranslucentWindowDemo();

                // Display the window.
                gtw.setVisible(true);
            }
        });
    }
} 
2

Ech, żal.pl
http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#6u10
Klasa AWTUtilities jest prywatna w JDK 1.6 więc musisz ja sobie "upublicznić"

import java.awt.Shape;
import java.awt.Window;
import java.lang.reflect.Method;

public final class AWTUtils {
    private static Class<?> awtUtilitiesClass;
    private static Method mSetWindowShape, mSetWindowOpacity;

    private AWTUtils() {
    }

    static void init() {
        try {
            awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities");
            mSetWindowShape = awtUtilitiesClass.getMethod("setWindowShape", Window.class, Shape.class);
            mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    static {
        init();
    }

    public static void setWindowShape(Window window, Shape shape) {
        try {
            mSetWindowShape.invoke(null, window, shape);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void setWindowOpacity(Window window, float opacity) {
        try {
            mSetWindowOpacity.invoke(null, window, Float.valueOf(opacity));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

0

Trzeba jeszcze dodać do klasy AWTUtils metodę
setWindowOpaque

i w tworzonym JFrame
setUndecorated(true);

I efekt jest zadowalający
Dzięki Pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1