2011-01-14 5 views
2

Ich versuche, schwere und leichte Komponenten gemäß these Richtlinien zu mischen.Kann leichte und schwere Komponenten nicht in einem undekorierten JFrame mischen

Ich erwarte den folgenden Code, um das gesamte Fenster grün zu malen. Stattdessen macht es den Bildschirm rote Hälfte von:

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class Testcase extends Canvas 
{ 
    private static final long serialVersionUID = 0L; 

    public static void main(String[] arg) 
    { 
    final boolean enableWorkaround = false; 
    EventQueue.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JLayeredPane layers = new JLayeredPane(); 
     frame.getContentPane().add(layers); 

     JPanel green = new JPanel(); 
     green.setBackground(Color.GREEN); 
     green.setBounds(0, 0, 800, 600); 
     layers.add(green, Integer.valueOf(1)); 

     Canvas red = new Canvas(); 
     red.setBackground(Color.RED); 
     red.setBounds(0, 0, 400, 600); 
     layers.add(red, Integer.valueOf(0)); 

     frame.setSize(800, 600); 
     if (!enableWorkaround) 
      frame.setUndecorated(true); 
     frame.setVisible(true); 
     } 
    }); 
    } 
} 

Abgebildet auf:

java version "1.6.0_23" 
Java(TM) SE Runtime Environment (build 1.6.0_23-b05) 
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing) 

und

java version "1.7.0-ea" 
Java(TM) SE Runtime Environment (build 1.7.0-ea-b124) 
Java HotSpot(TM) Client VM (build 20.0-b05, mixed mode, sharing) 

Ist mein Code irgendwelche Fehler enthält, oder ist dies ein legitimes JDK Bug?

+0

Das interessiert mich. – user489041

+0

Grundlegende Frage: Warum müssen Sie leichte und schwere Wägekomponenten mischen? Zuletzt habe ich gelesen, dass SUN gesagt hat, dass das keine gute Idee war (oder natürlich vor einer Weile). Was passiert, wenn Sie nur Swing ohne Mischen in AWT-Komponenten verwenden? – Merky

+0

Wir können nicht einfach leicht gehen, weil Java 3D-Engines OpenGL-native Canvases unter der Haube verwenden. Wir können nicht nur Schwergewicht sein, weil der alte Teil unserer Anwendung auf Swing basiert und es wenig Anreiz gibt, ihn neu zu schreiben (wir brauchen kein 3D für diese Komponenten). – Gili

Antwort

0

Ihr Code scheint in Ordnung zu sein, da er so funktioniert, wie Sie denken würden, wenn Sie ein JPanel anstelle eines Canvas für red verwenden. Dies scheint ein Fehler beim Mischen schwerer und leichter Komponenten zu sein.

Was this question on overlapping components in der ausgewählten Antwort erwähnt, scheint es, dass es immer noch eine schlechte Idee, Schwergewicht und leichte Komponenten zu mischen, wenn sie eine leichte Komponente über eine Schwergewicht Komponente beinhalten überlappen.

jedoch überlappende eine Schwergewicht über eine leichte Komponente scheint, zu arbeiten, wenn Sie also green in die Leinwand und red in die JPanel ändern, wird es funktionieren. Es funktioniert auch, wenn beide JPanels oder beide Canvases sind.

Das heißt, es sei denn, Sie müssen wirklich, es ist im Allgemeinen besser zu vermeiden, leichte und schwere Komponenten zu mischen.

Hoffnung, das hilft.

Verwandte Themen