如何消除OSX上Java AWT框架的阴影?

如何消除OSX上Java AWT框架的阴影?,java,macos,awt,frame,dropshadow,Java,Macos,Awt,Frame,Dropshadow,是否可以在OSX上禁用Java AWT应用程序的放置阴影? 我想创建一个透明的窗口,它可以很好地工作,但我无法摆脱阴影 如果我使用的是JFrame,这可以通过以下方式完成: JRootPane root = frame.getRootPane(); root.putClientProperty( "Window.shadow", Boolean.FALSE ); AWT机架是否有类似的可能性 我使用的框架和代码如下所示: void setup(){ frame.removeNotify

是否可以在OSX上禁用Java AWT应用程序的放置阴影? 我想创建一个透明的窗口,它可以很好地工作,但我无法摆脱阴影

如果我使用的是
JFrame
,这可以通过以下方式完成:

 JRootPane root = frame.getRootPane();
 root.putClientProperty( "Window.shadow", Boolean.FALSE );
AWT机架是否有类似的可能性

我使用的框架和代码如下所示:

void setup(){
  frame.removeNotify();
  frame.setUndecorated(true);
}

这是一个简单的应用程序,它使用一个透明窗口,在Java 7下的Max OS X 10.7.5上运行(在Java 6下运行),没有任何问题

共享一些代码,以便我们可以复制问题

根据反馈更新

我已经在MacOS10.7.5和10.8.2上使用JDK1.7.0_07和1.6.0_37测试了这一点

不带和带
Window.shadow
属性

如果不进行大量测试,也没有进一步的信息,我建议您尽早拨打此电话。如果这不起作用,请在使窗口可见之前将其作为最后一个调用

这可能与Java/AWT如何连接到它的本机对等机有关,很可能,一旦建立了连接,您将无法再影响这些类型的属性

public class TransparentFrame {

    public static void main(String[] args) {
        new TransparentFrame();
    }

    public TransparentFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }
                // Use this to test the transparentancy API
                //doTransparentFrame();
                doDropShadow();
            }

        });
    }

    protected void doDropShadow() {
        String version = System.getProperty("java.version");
        System.out.println(version);
        JFrame frame = new JFrame("Testing");
        JRootPane root = frame.getRootPane();
        root.putClientProperty("Window.shadow", root);
        frame.setUndecorated(true);
        frame.setContentPane(new ContentPane());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new ImagePane());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    protected void doTransparentFrame() {
        JFrame frame = new JFrame("Testing");
        frame.setUndecorated(true);
        frame.setContentPane(new ContentPane());

        String version = System.getProperty("java.version");
        System.out.println(version);
        if (version.startsWith("1.7")) {
            frame.setBackground(new Color(0, 0, 0, 0));
        } else if (version.startsWith("1.6")) {
            if (supportsPerAlphaPixel()) {
                setOpaque(frame, false);
            } else {
                System.out.println("Per Pixel Alphering is not support with Java " + version);
                System.exit(1);
            }
        } else {
            System.out.println("Per Pixel Alphering is not support with Java " + version);
            System.exit(1);
        }
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new ImagePane());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static boolean supportsPerAlphaPixel() {

        boolean support = false;

        try {

            Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities");
            support = true;

        } catch (Exception exp) {
        }

        return support;

    }

    public static void setOpaque(Window window, boolean opaque) {

        try {

            Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities");
            if (awtUtilsClass != null) {

                Method method = awtUtilsClass.getMethod("setWindowOpaque", Window.class, boolean.class);
                method.invoke(null, window, opaque);

            }

        } catch (Exception exp) {
        }

    }

    public class ContentPane extends JPanel {

        public ContentPane() {
            setOpaque(false);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
        }

    }

    public class ImagePane extends JPanel {

        private BufferedImage background;
        private BufferedImage offImage;
        private Ellipse2D offButton;
        private boolean mouseIn;

        public ImagePane() {
            setOpaque(false);
            try {
                background = ImageIO.read(new File("tamagotchi400.png"));
                offImage = ImageIO.read(new File("powerSmall.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            offButton = new Ellipse2D.Float(212, 330, 25, 25);
            MouseAdapter handler = new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) {
                        if (offButton.contains(e.getPoint())) {
                            Window window = SwingUtilities.getWindowAncestor(ImagePane.this);
                            if (window != null) {
                                window.dispose();
                            }
                        }
                    }
                }

                @Override
                public void mouseMoved(MouseEvent e) {
                    Cursor cursor = Cursor.getDefaultCursor();
                    if (offButton.contains(e.getPoint())) {
                        cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }
                    setCursor(cursor);
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    mouseIn = true;
                    repaint();
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    mouseIn = false;
                    repaint();
                }

            };
            addMouseListener(handler);
            addMouseMotionListener(handler);
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? new Dimension(400, 400) : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g2d.drawImage(background, x, y, this);
                if (mouseIn && offImage != null) {
                    g2d.drawImage(offImage, (int) offButton.getX(), (int) offButton.getY(), this);
                }
                g2d.dispose();
            }
        }

    }

}
在Windows 7 Java 1.6和1.7、Mac OS 10.7.5和10.8.2上测试,使用JDK 1.7.0_07和1.6.0_37

您似乎不了解Java中的窗口层次结构

Java中的所有“窗口”都源自
Java.awt.Window


JFrame
扩展
Frame
它扩展了
窗口

使用这一行,它可以工作:

AWTUtilities.setWindowOpaque(frame, false);
Eclipse打印了一个警告,我不得不更改一些设置来搞笑它,所以我想可能有更好的方法。
我读到,这是从OSX10.6(Lion)开始支持的。

当你的帧没有聚焦时,阴影效果会被触发。尝试添加此代码,使您的帧无法聚焦

frame.setFocusableWindowState(false);

没有问题,我只是不知道如何去除blanc AWT框架中的阴影。我在Mac OS上使用透明框架,但没有很多,它们不显示阴影。你能分享一些代码吗?这样我们就可以看到你是如何创建你的窗口的,这样我们就可以复制它,这样我们就可以提供更多帮助。所以你的示例代码不是要制作一个透明的框架,而是一个无框架的框架。是的,我正在显示一个桌面截图,看起来它是透明的。还有一些函数可以使用AWTUtilities创建透明框架,但这些函数仅限于windows。使用屏幕截图的方法,创建一个“透明”的框架是我的工作。。。除了阴影。啊……现在哪里得到一些呢;)
frame.setFocusableWindowState(false);