4

以前に同様の質問が投稿されたことは知っていますが、回答やサンプル コードはありませんでした。

キャンバスの上に透明な 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 プロパティを使用することは、最後の解決策です (強くお勧めしません)。

4

2 に答える 2

2

重量のあるコンポーネントと軽量のコンポーネントが混在しているため、おそらくこれを機能させることはできません。

以前は、キャンバスのような重量のあるコンポーネントの上に軽量のパネルを描画することは不可能でした。JDK 6 Update 12 および JDK 7 build 19 以降、Java はこれを修正し、2 つを正しくオーバーラップできますが、制限があります。具体的には、オーバーラップスイングコンポーネントを透明にすることはできません。

新しい動作を含むこれに関する適切な説明は、次のページにあります:重量コンポーネントと軽量コンポーネントの混合 特定の問題の制限セクションを確認してください。

GlassPane も軽量であるため、使用しても役に立たないと思います。

Canvas の代わりに JPanel を拡張するように BackGround クラスを変更すると、必要な動作が得られます。

于 2011-01-21T16:54:33.093 に答える
0

AWT には制限がありますが、Container クラスまたはComponentクラスのいずれかを拡張することにより、AWT 自体に同様のものを実装することはそれほど難しくありません。

于 2011-01-21T18:28:21.663 に答える