2

我创建了透明的 JDialog,不幸的是它不适用于两个屏幕。当它被拖到其他屏幕时,它变得不透明。代码如下,只需运行它并将标签拖到其他屏幕。

public class TransparentFrame{

public static void main(String[] args) {
    JDialog dialog = createDialog();
    SwingUtilities.invokeLater(() -> dialog.setVisible(true));
}


private static JDialog createDialog() {
    JDialog dialog = new JDialog();

    JLabel label = new JLabel("drag me to the other screen");
    label.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            SwingUtilities.invokeLater(() -> dialog.setLocation(e.getLocationOnScreen()));
        }
    });
    label.setOpaque(false);
    dialog.getContentPane().add(label);

    dialog.setUndecorated(true);
    dialog.getRootPane().setWindowDecorationStyle(JRootPane.NONE);

    dialog.setBackground(new Color(0, 0, 0, 0));
    dialog.getContentPane().setBackground(new Color(0, 0, 0, 0));

    dialog.pack();
    return dialog;
}

}

有人知道如何解决吗?

环境:带有 Cinnamon 的 Ubuntu 14.04,java 1.8.0_74-b02

4

2 回答 2

0

我创建了透明的 JDialog

不知道在这种情况下是否存在问题,但 Swing 和透明颜色无法相处,因为您违反了 Swing 及其组件之间的绘画合同。查看具有透明度的背景以获取更多信息。

不要使用透明颜色,而是尝试使用:

dialog.setOpacity(...);
于 2016-03-21T15:20:28.127 回答
0

尽管这可能是也可能不是问题的根源,但最好去除透明窗口的阴影。如果没有这些行,我的程序(在 Mac 上)会在中断时将阴影“燃烧”到窗口显示中。尽管它是单显示器设置(MacBook 屏幕),但在桌面之间切换会将阴影“燃烧”到窗口显示中。

JRootPane root = frame.getRootPane(); root.putClientProperty("Window.shadow", Boolean.FALSE);

于 2016-03-21T15:22:33.690 回答