2016-03-21 6 views
2

Я создал прозрачный JDialog, который, к сожалению, не работает с двумя экранами. Когда его перетаскивают на другой экран, он становится непрозрачным. Код ниже, просто запустите его и перетащите ярлык на другой экран.прозрачный JDialog становится непрозрачным при перетаскивании на второй экран (ubuntu 14.04 с Cinnamon, java 1.8.0_74-b02)

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 с корицей, Java 1.8.0_74-b02

+0

прекрасно работает на моих трех экранах (бег соответствие Java1.7, заменить лямбды с новым Runnable()) – FredK

+0

ли вы запустить его на Ubuntu или другой Linux? –

+0

'dialog.getContentPane(). SetBackground (новый цвет (0, 0, 0, 0));' - плохая идея, вместо этого используйте 'setOpaque' (вам нужно будет использовать' contentPane' 'JPanel' first) – MadProgrammer

ответ

0

Я создал прозрачный JDialog

Не знаю, если это проблема, в этом случае, но свинг и прозрачные цвета не ладите, потому что вы нарушаете контракт на живопись между Swing и его компонентами. За дополнительной информацией обращайтесь к Backgrounds With Transparency.

Вместо того, чтобы играть с прозрачными цветами, попробуйте использовать:

dialog.setOpacity(...); 
+0

К сожалению, моя ОС не поддерживает непрозрачность. Вызывается исключение: «java.lang.UnsupportedOperationException: прозрачность TransLUCENT не поддерживается», когда непрозрачность установлена ​​в значение lover, чем 1f. Кроме того, непрозрачность заставляет все компоненты быть прозрачными. –

+0

На основе [Как реализовать прозрачность на пикселях] (https://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#per-pixel), используя альфа-цвет для фона диалогов правильно, но это неправильно для области содержимого (да, это не сбивает с толку), а также congrads из 200k +! – MadProgrammer

+0

@MadProgrammer, спасибо, я начинаю чувствовать себя старым :) – camickr

0

Хотя это может или не может быть источником проблемы, то лучше удалить тень прозрачного окна. Без этих строк моя программа (на Mac) «прервала» тени в окне дисплея. Хотя это единственная настройка монитора (экран MacBook), переключение между рабочими столами «сжигает» тени в окне.

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

+0

К сожалению, с этими строками ничего не изменилось. –

+0

@WojtekWirzbicki По крайней мере, вы видели, как исчезает тень (если это было для начала)? Также было бы полезно увидеть изображение того, что происходит. – Laurel

 Смежные вопросы

  • Нет связанных вопросов^_^