Bevor Sie lesen, hier sind einige Präzisierungen, was die Frage geht:.Nicht-opaker JButton-Hintergrund im nicht obersten Fenster wird undurchsichtig?
- 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.
- 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)
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)
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 ...
- Was ist los? Wie in, warum zeigt dies Verhalten einer benutzerdefinierten bemalten nicht-opaque-Komponente, die vergisst, Super zu nennen?
- Warum passiert es nicht mit TL-Fenstern?
- Was ist der einfachste Weg, um es zu beheben, abgesehen davon, dass keine Nicht-TL-Fenster verwendet werden?
Sie bitte Ihren SSCCE Code einfügen hier, nicht in einem Link. –
Die Verknüpfung wurde durch den vollständigen Code ersetzt. – afk5min
[keine Idee, wenn in Java7 kompiliert wird] (http://Stackoverflow.com/a/16699136/714968) – mKorbel