Вопрос

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

Мне нужна прозрачная 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 всей кадра является самым последним решением (очень обескуражено)

Это было полезно?

Решение

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

В прошлом раньше было невозможно нарисовать легкие панели из -за тяжелых компонентов, таких как холст. Поскольку JDK 6 Обновление 12 и JDK 7 Build 19 Java исправил это, и вы можете перекрывать 2 правильно, однако это поставляется с ограничениями. В частности, в вашем случае компонент перекрытия не может быть прозрачным.

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top