Прозрачная JPanel поверх холста (VLCJ) - PullRequest
4 голосов
/ 21 января 2011

Я знаю, что аналогичный вопрос был опубликован до , но не было никакого кода ответа или примера.

Мне нужен прозрачный JPanel поверх холста.Приведенный ниже код не работает

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);
    }
}

Использование свойства GlassPane всего фрейма - самое последнее решение (крайне не рекомендуется)

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Вы, вероятно, не сможете заставить это работать, потому что вы смешиваете тяжелые и легкие компоненты вместе.

Раньше раньше было невозможно рисовать легкие панели над тяжелыми компонентами, такими как Canvas.Начиная с JDK 6 Update 12 и JDK 7 build 19 в Java это исправлено, и вы можете корректно перекрывать 2, однако это имеет свои ограничения.В частности, в вашем случае перекрывающийся компонент качания не может быть прозрачным.

Хорошее описание этого, включая более новое поведение, можно найти на этой странице: Смешивание тяжелых и легких компонентов Проверьте раздел ограничений дляВаша конкретная проблема.

Я не думаю, что использование GlassPane поможет, поскольку оно также легкое.

Если вы измените класс BackGround, чтобы расширить JPanel вместо Canvas, вы получите поведение, которое выхочу.

0 голосов
/ 21 января 2011

Хотя AWT ограничен, не должно быть слишком сложно реализовать нечто подобное с самим AWT, расширяя либо Контейнер, либо Компонент класс.

...