1

画像を2枚載せています。1 つは背景画像で、もう 1 つは棒人間の画像です。背景の前に棒人間を描きたいです。棒人間を表示するコードの後に​​背景画像を配置するコードを挿入することで、これを実現できます。バックグラウンドコードの後に​​スティックフィギュアコードを挿入することで、同じことを達成する方法があるかどうか疑問に思っていたので、バックグラウンドの上に新しい JLabels を配置し続けることができました。

動作するコード:

    guy.setBounds(0,0,100,100);
    panel.add(guy);

    backgroundPic.setBounds(0,0,550,550);
    panel.add(backgroundPic);

    setVisible(true);

私が働きたいコード:

    backgroundPic.setBounds(0,0,550,550);
    panel.add(backgroundPic);

    guy.setBounds(0,0,100,100);
    panel.add(guy);


    setVisible(true);
4

3 に答える 3

3

1つの背景画像のみを気にする場合は、JPanelを拡張し、paintComponentをオーバーライドして、背景画像をペイントすることをお勧めします。

複数のコンポーネントのZオーダーを気にする必要がある場合は、JLayeredPaneが最適な代替手段です。

最初のオプションを示す小さなスニペットを次に示します。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test2 {
    private static class PanelWithBackground extends JPanel {

        private Image backgroundImage;
        private Point backgroundLocation = new Point();

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (getBackgroundImage() != null) {
                g.drawImage(getBackgroundImage(), backgroundLocation.x, backgroundLocation.y, this);
            }
        }

        public Image getBackgroundImage() {
            return backgroundImage;
        }

        public void setBackgroundImage(Image backgroundImage) {
            this.backgroundImage = backgroundImage;
            repaint();
        }

        public Point getBackgroundLocation() {
            return backgroundLocation;
        }

        public void setBackgroundLocation(Point backgroundLocation) {
            this.backgroundLocation = backgroundLocation;
            repaint();
        }
    }

    protected static void initUI() throws MalformedURLException {
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PanelWithBackground panelWithBackground = new PanelWithBackground();
        panelWithBackground.setLayout(null);
        panelWithBackground.setBackgroundImage(new ImageIcon(new URL(
                "http://2.bp.blogspot.com/-PqKuKt5mRmc/Tvi-K-4FVVI/AAAAAAAACKg/YwzkME5gGvk/s1600/black+background.jpg")).getImage());
        JLabel guy = new JLabel(new ImageIcon(new URL(
                "http://www.clipproject.info/Cliparts_Free/Menschen_Free/Clipart-Cartoon-Design-04.gif")));
        // Next 2 lines should rather be performed by a LayoutManager
        panelWithBackground.setPreferredSize(new Dimension(1024, 768));
        guy.setBounds(50, 200, guy.getPreferredSize().width, guy.getPreferredSize().height);

        panelWithBackground.add(guy);
        frame.add(panelWithBackground);
        frame.pack();
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                try {
                    initUI();
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}
于 2012-06-09T13:12:51.773 に答える
1

Z オーダーを使用して、コンポーネントをレンダリングする順序を示すことができます。

java.awt.Container.getComponentZOrder(Component)

ドキュメントによると:

コンテナー内のコンポーネントの z オーダー インデックスを返します。コンポーネントが z オーダー階層で上位にあるほど、そのインデックスは低くなります。最小の z オーダー インデックスを持つコンポーネントは、他のすべての子コンポーネントの上に最後に描画されます。

パラメータ: compクエリされるコンポーネント

戻り値: コンポーネントの z オーダー インデックス。それ以外の場合、コンポーネントが null であるか、コンテナーに属していない場合は -1 を返します

于 2012-06-09T12:37:06.323 に答える
0

私はJavaの専門家であるとは主張しませんし、これが正しいと主張するつもりもありません。ただの推測ですが、削除してみてください

.setBounds()

それでも効果がない場合は、使用してみてください

.setSize()

幸運を祈ります:)

于 2012-06-09T12:38:23.907 に答える