Frage

Ich weiß, dass eine ähnliche Frage war Gepostet zuvor, aber es gab keine Antwort oder Beispielcode.

Ich brauche ein transparentes JPanel auf einer Leinwand. Der unten veröffentlichte Code funktioniert nicht

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

public class Main {
    private static class Background extends Canvas{
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.setColor(Color.RED);
            g.drawOval(10, 10, 20, 20);
        }
    }

    private static class Transparent extends JPanel {

        public Transparent() {
            setOpaque(false);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.GREEN);
            g.drawOval(20, 20, 20, 20);
        }
    }

    public static void main(String[] args){
        JFrame frame = new JFrame();
        JLayeredPane layered = new JLayeredPane();
        Background b = new Background();
        Transparent t = new Transparent();

        layered.setSize(200, 200);
        b.setSize(200, 200);
        t.setSize(200, 200);

        layered.setLayout(new BorderLayout());
        layered.add(b, BorderLayout.CENTER, 1);
        layered.add(t, BorderLayout.CENTER, 0);

        frame.setLayout(new BorderLayout());
        frame.add(layered, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }
}

Die Verwendung der GlaSpane -Eigenschaft des gesamten Rahmens ist die allerletzte Lösung (stark entmutigt)

War es hilfreich?

Lösung

Sie werden wahrscheinlich nicht in der Lage sein, dies zu funktionieren, da Sie mit Schwergewicht und leichten Komponenten zusammen mischen.

In der Vergangenheit war es früher unmöglich, leichte Paneele über schwere Komponenten wie eine Leinwand zu zeichnen. Seit JDK 6 Update 12 und JDK 7 Build 19 Java hat dies korrigiert und Sie können die 2 korrekt überlappen, aber es wird mit Einschränkungen verbunden. Insbesondere in Ihrem Fall kann die überlappende Schwungkomponente nicht transparent sein.

Eine gute Beschreibung dafür einschließlich des neueren Verhaltens finden Sie auf dieser Seite: Mischen von Schwergewichts- und Leichtkomponenten Überprüfen Sie den Abschnitt Einschränkungen für Ihr spezifisches Problem.

Ich glaube nicht, dass die Verwendung der GlaSpane hilfreich ist, da es auch leicht ist.

Wenn Sie die Hintergrundklasse ändern, um JPanel anstelle von Leinwand zu erweitern, erhalten Sie das gewünschte Verhalten.

Andere Tipps

Während AWT begrenzt ist, sollte es nicht zu schwierig sein, etwas Ähnliches mit AWT selbst zu implementieren, indem Sie entweder den Container oder den Container erweitern oder Komponente Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top