3

いくつかの不透明なカスタムコンポーネントが実装されたJPanelがあります。ここで、paintComponent()メソッドをオーバーライドして、これらのコンポーネントの上に何かを描画したいと思います。私の問題は、ペイントされたものが埋め込まれたコンポーネントの後ろに配置され、不透明であるため、それらで覆われていることです。

コンポーネントの上に絵を表示させる方法はありますか?

これが私がやろうとしていることの短い例です:

public class DrawOnTop {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new JFrame("Draw on top");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new MyPanel());
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

class MyPanel extends JPanel {

    public MyPanel() {
        setLayout(new BorderLayout(3, 3));
        add(new JButton("Button 1"), BorderLayout.NORTH);
        add(new JButton("Button 2"), BorderLayout.CENTER);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.drawLine(0, 0, getVisibleRect().width, getVisibleRect().height);
    }
}
4

1 に答える 1

2

あなたは正しい方向に向かって考えていました。paintChildren()唯一の問題は、以下のコードのようにメソッドをオーバーライドする必要があることでした。これは、paintComponent()メソッドが最初に呼び出され、コンポーネント自体(MyPanel)の背景などのペイントを実行し、次に呼び出されpaintBorders()、最後に、paintChildren()それを呼び出すコンポーネントの内部にあるすべてのものをペイントするためです。

public class DrawOnTop {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("Draw on top");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new MyPanel());
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

class MyPanel extends JPanel {

    public MyPanel() {
        setLayout(new BorderLayout(3, 3));
        JButton b1 = new JButton("Button 1");
        MouseListener ml = new MouseAdapter() {

            @Override
            public void mouseExited(MouseEvent e) {
                super.mouseExited(e);
                MyPanel.this.repaint();
            }
        };
        b1.addMouseListener(ml);
        JButton b2 = new JButton("Button 2");
        b2.addMouseListener(ml);
        add(b1, BorderLayout.NORTH);
        add(b2, BorderLayout.CENTER);
    }

    @Override
    protected void paintChildren(Graphics g) {
        super.paintChildren(g);
        g.setColor(Color.red);
        g.drawLine(0, 0, getVisibleRect().width, getVisibleRect().height);
    }
}

コードサンプルでは、​​マウスがボタンを出たときにパネルを再描画するためのaも追加したことに注意MouseListenerしてください。そうしないと、マウスがボタンの1つに入ると、ボタンは常に行上に留まります。

ただし、常にコンポーネントの上にカスタムペイントを作成したい場合は、ガラスペインを使用することをお勧めします。ガラス板の使用例を以下に示します。

  1. シンプルなもの。
  2. より複雑なもの。
于 2012-06-15T11:20:50.643 に答える