2013-08-29 14 views
7

Bevor Sie lesen, hier sind einige Präzisierungen, was die Frage geht:.Nicht-opaker JButton-Hintergrund im nicht obersten Fenster wird undurchsichtig?

  1. Die SSCCE für Java entwickelt ist 7. Es wäre möglich, Sonne zu nutzen * AWTUtilities es 6 bis Java anzupassen, aber. Es ist mir egal, wie es auf Java 6 funktioniert.
  2. Die fehlerhafte Zeile ist [...] new JDialog(someWindow). Ghosting kann behoben werden in der SSCCE durch einfaches Ändern diese Linie zu [...]new JDialog().

Warum Ghosting nicht Top-Level-Fenster zeigen?


Erwartetes Verhalten: final JDialog d = new JDialog() (siehe SSCCE) both TL and non-TL windows have translucent background

Wie Sie sehen können, das rechte Fenster einen halbtransparenten Hintergrund hat (wie erwartet).

tatsächliches Verhalten: final JDialog d = new JDialog(f) (siehe SSCCE) TL window shows translucent background, while non-TL background becomes opaque even after a single repaint

In diesem Fall wird das rechte Fenster hat einen undurchsichtigen Hintergrund. In der Tat dauert es 3-4 Repaints aus irgendeinem Grund (am einfachsten zu reproduzieren ist Repaint bei Rollover) für den Hintergrund vollständig undurchsichtig zu werden.


SSCCE:

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.plaf.synth.ColorType; 
import javax.swing.plaf.synth.Region; 
import javax.swing.plaf.synth.SynthConstants; 
import javax.swing.plaf.synth.SynthContext; 
import javax.swing.plaf.synth.SynthLookAndFeel; 
import javax.swing.plaf.synth.SynthPainter; 
import javax.swing.plaf.synth.SynthStyle; 
import javax.swing.plaf.synth.SynthStyleFactory; 

public class SynthSSCCE 
{ 
     public static void main(String[] args) throws Exception 
     { 
       final SynthLookAndFeel laf = new SynthLookAndFeel(); 
       UIManager.setLookAndFeel(laf); 
       SynthLookAndFeel.setStyleFactory(new StyleFactory()); 

       SwingUtilities.invokeLater(new Runnable() 
       { 
         @Override 
         public void run() 
         { 
           final JFrame f = new JFrame(); 
           { 
             f.add(new JButton("Works properly")); 
             f.setUndecorated(true); 
             f.setBackground(new Color(0, true)); 
             f.setSize(300, 300); 
             f.setLocation(0, 0); 
             f.setVisible(true); 
           } 
           { 
             final JDialog d = new JDialog(f); 
             final JButton btn = new JButton("WTF?"); 
             // uncomment and notice that this has no effect 
             // btn.setContentAreaFilled(false); 
             d.add(btn); 
             d.setUndecorated(true); 
             d.setBackground(new Color(0, true)); 
             d.setSize(300, 300); 
             d.setLocation(320, 0); 
             d.setVisible(true); 
           } 
         } 
       }); 
     } 

     static class StyleFactory extends SynthStyleFactory 
     { 
       private final SynthStyle style = new Style(); 

       @Override 
       public SynthStyle getStyle(JComponent c, Region id) 
       { 
         return style; 
       } 
     } 

     static class Style extends SynthStyle 
     { 
       private final SynthPainter painter = new Painter(); 

       @Override 
       protected Color getColorForState(SynthContext context, ColorType type) 
       { 
         if (context.getRegion() == Region.BUTTON && type == ColorType.FOREGROUND) 
           return Color.GREEN; 

         return null; 
       } 

       @Override 
       protected Font getFontForState(SynthContext context) 
       { 
         return Font.decode("Monospaced-BOLD-30"); 
       } 

       @Override 
       public SynthPainter getPainter(SynthContext context) 
       { 
         return painter; 
       } 

       @Override 
       public boolean isOpaque(SynthContext context) 
       { 
         return false; 
       } 
     } 

     static class Painter extends SynthPainter 
     { 
       @Override 
       public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) 
       { 
         final Graphics g2 = g.create(); 
         try 
         { 
           g2.setColor(new Color(255, 255, 255, 128)); 

           g2.fillRect(x, y, w, h); 
         } 
         finally 
         { 
           g2.dispose(); 
         } 
       } 

       @Override 
       public void paintButtonBackground(SynthContext context, Graphics g, int x, int y, int w, int h) 
       { 
         final Graphics g2 = g.create(); 
         try 
         { 
           if ((context.getComponentState() & SynthConstants.MOUSE_OVER) == SynthConstants.MOUSE_OVER) 
             g2.setColor(new Color(255, 0, 0, 255)); 
           else 
             g2.setColor(new Color(0xAA, 0xAA, 0xAA, 255)); 
           g2.fillRoundRect(x, y, w, h, w/2, h/2); 
         } 
         finally 
         { 
           g2.dispose(); 
         } 
       } 
     } 
} 

Und diese sind meine Fragen ...

  1. Was ist los? Wie in, warum zeigt dies Verhalten einer benutzerdefinierten bemalten nicht-opaque-Komponente, die vergisst, Super zu nennen?
  2. Warum passiert es nicht mit TL-Fenstern?
  3. Was ist der einfachste Weg, um es zu beheben, abgesehen davon, dass keine Nicht-TL-Fenster verwendet werden?
+0

Sie bitte Ihren SSCCE Code einfügen hier, nicht in einem Link. –

+0

Die Verknüpfung wurde durch den vollständigen Code ersetzt. – afk5min

+0

[keine Idee, wenn in Java7 kompiliert wird] (http://Stackoverflow.com/a/16699136/714968) – mKorbel

Antwort

1

es 3-4 Bemalungen aus irgendeinem Grunde nimmt (am einfachsten ist auf Rollover zu reproduzieren neu streichen) für den Hintergrund völlig undurchsichtig zu werden.

Überprüfen Sie Backgrounds With Transparency, die Ihnen einen Einblick in das Problem geben sollte.

Ich habe noch nie mit Synth gespielt, also weiß ich nicht, ob die gleiche Lösung funktioniert oder nicht.

+0

Synth folgt nicht dem allgemeinen Pre-Nimbus L & F Konsens, dass eine undurchsichtige Komponente eine solche Komponente ist, die ihren Hintergrund malt und umgekehrt.Synth ermöglicht nicht opaken Komponenten, ihren Hintergrund so zu zeichnen, wie er sein sollte (für bestimmte Komponenten steuert isContentAreaFilled in UIDefaults, ob der Hintergrund gemalt wird). ** Die Hauptfrage ist, warum alles an TL-Fenstern funktioniert, aber nicht an Nicht-TL-Fenstern? ** – afk5min

0

Warum zeigen Fenster der obersten Ebene keine Geisterbilder?

Nach Oracle (Java Anleitungen):

Jede der obersten Ebene Behälter hat einen Inhaltsbereich, die, allgemein gesprochen, (direkt oder indirekt) enthält die sichtbaren Komponenten daß Top-Level-Container-GUI.

http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

enter image description here

Die Glasscheibe wird oft verwendet, Eingabeereignisse abzufangen der Top-Level-Container auftreten über und kann auch zu malen, über mehrere Komponenten verwendet werden. Es erlaubt keine Transparenz.

So wie Sie

final Graphics g2 = g.create(); 

verwendet Wenn Sie die javax.swing.JComponent.paintComponent in einem Verfahren overrided haben im Gegensatz zu der Erstellung der Grafik-Objekt selbst sollte die Transparenz von super.g mildern() ;

Fix dies durch ein separates Verfahren Erstellen von Grafiken für oben aufgeführten

+0

ernsthaft bezweifeln, dass die Glasscheibe etwas mit dem Problem zu tun hat: f.i. Wie würde das das unterschiedliche Verhalten von neuem JDialog() gegenüber neuem JDialog (Frame) erklären? – kleopatra

+0

Alle Komponenten werden dem Inhaltsbereich hinzugefügt. Die Glasscheibe ist komplett unbenutzt (im SSCCE zu sehen). – afk5min