2016-03-21 24 views
2

Ich erstellte transparente JDialog, die leider nicht mit zwei Bildschirmen funktioniert. Wenn es auf einen anderen Bildschirm gezogen wird, wird es undurchsichtig. Der Code ist unten, führen Sie es einfach aus und ziehen Sie das Etikett auf einen anderen Bildschirm.transparent JDialog wird undurchsichtig beim Ziehen auf den zweiten Bildschirm (Ubuntu 14.04 mit 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; 
} 

}

Weiß jemand, wie man es beheben?

Umwelt: Ubuntu 14.04 mit Zimt, Java 1.8.0_74-b02

+0

Läuft auf meine drei Bildschirme Fein (Lauf Java1.7 Compliance, ersetzt lambdas mit neuen Runnable()) – FredK

+0

Haben Sie führen es auf Ubuntu oder andere Linux? –

+0

'dialog.getContentPane(). SetBackground (neue Farbe (0, 0, 0, 0));' ist eine schlechte Idee, stattdessen 'setOpaque' zu ​​verwenden (du musst das' contentPane' auf ein 'JPanel' aufziehen) Erstens) – MadProgrammer

Antwort

0

I transparent JDialog erstellt

Sie wissen nicht, ob es ein Problem in diesem Fall ist aber schwingen und transparente Farben verhalte dich nicht, weil du den Bildkontrakt zwischen Swing und seinen Komponenten durchbrichst. Weitere Informationen finden Sie unter Backgrounds With Transparency.

Statt mit transparenten Farben zu spielen, versuchen Sie es mit:

dialog.setOpacity(...); 
+0

Leider unterstützt mein Betriebssystem keine Deckkraft. Es wird eine Ausnahme ausgelöst: "java.lang.UnsupportedOperationException: TRANSLUCENT Transluzenz wird nicht unterstützt", wenn die Deckkraft auf einen Wert eingestellt ist, der höher als 1f ist. Neben der Opazität sind alle Komponenten transparent. –

+0

Basierend auf [Wie pro-Pixel-Transluzenz implementieren] (https://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#per-pixel), ist die Verwendung einer Alpha-basierten Farbe für den Dialoghintergrund richtig, aber es ist falsch für das Inhaltsfenster (ja, das ist nicht verwirrend), auch kongrats der 200k +! – MadProgrammer

+0

@MadProgrammer, danke, ich fange an, mich alt zu fühlen :) – camickr

0

Obwohl dies kann oder kann nicht die Ursache des Problems sein, ist es am besten, den Schatten eines transparenten Fenster zu entfernen. Ohne diese Zeilen würde mein Programm (auf Mac) die Schatten in die Fensteranzeige "brennen", wenn es unterbrochen wird. Obwohl es sich um ein einzelnes Monitor-Setup handelt (MacBook-Bildschirm), würde das Wechseln zwischen Desktops die Schatten in die Fensteranzeige "brennen".

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

+0

Leider hat sich nichts mit diesen Zeilen geändert. –

+0

@WojtekWirzbicki Hast du zumindest den Schatten verschwinden sehen (wenn er einen hatte)? Es könnte auch hilfreich sein, ein Bild von dem zu sehen, was passiert. – Laurel