拖动到第二个屏幕时,透明的JDialog变得不透明(ubuntu 14.04 with Cinnamon,java 1.8.0_74-b02)

时间:2016-03-21 12:21:47

标签: java swing jdialog jwindow

我创建了透明的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;
}

}

有人知道如何解决它吗?

环境:Ubuntu 14.04 with Cinnamon,java 1.8.0_74-b02

2 个答案:

答案 0 :(得分:0)

  

我创建了透明的JDialog

在这种情况下不知道它是否是一个问题,但Swing和透明颜色不相处,因为你打破了Swing及其组件之间的绘画合约。查看Backgrounds With Transparency了解详情。

请尝试使用:

,而不是使用透明色
dialog.setOpacity(...);

答案 1 :(得分:0)

虽然这可能是也可能不是问题的根源,但最好删除透明窗口的阴影。如果没有这些内容,我的程序(在Mac上)会烧掉#34;中断时阴影进入窗口显示。虽然它是单个显示器设置(MacBook屏幕),但在台式机之间切换会烧坏"阴影进入窗口显示。

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