3

この質問はよく聞かれますが、どこでも答えが不足しています。次のように、JPanel を拡張して paintComponent をオーバーライドすることで、JFrame に背景画像を表示させることができます。

class BackgroundPanel extends JPanel {
    private ImageIcon imageIcon;
    public BackgroundPanel() {
        this.imageIcon = Icons.getIcon("foo");
  }

    @Override
    protected void paintComponent(Graphics g) {
       super.paintComponent(g);
        g.drawImage(imageIcon.getImage(), 0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight(),this);
    }
}

しかし今、その背景の上にコンポーネントを追加するにはどうすればよいでしょうか? 私が行くと

JFrame w = new JFrame() ;
Container cp = w.getContentPane();
cp.setLayout(null);

BackgroundPanel bg = new BackgroundPanel();
cp.add(bg);

JPanel b = new JPanel();
b.setSize(new Dimension(30, 40));
b.setBackground(Color.red);
cp.add(b);
w.pack()
w.setVisible(true)

背景ではなく小さな赤い四角形(またはその他のコンポーネント)が表示されますが、削除するcp.setLayout(null);と背景は表示されますが、他のコンポーネントは表示されません。これは、null LayoutManager によって呼び出されていない paintComponent と関係があると推測していますが、LayoutManager の仕組みについてはまったく詳しくありません (これは大学向けのプロジェクトであり、課題では特に LayoutManager を使用しないように指示されています)。 .

画像を作成すると、背景にnullを表示する必要があります(したがって、透明(??))赤い四角が表示されるため、背景が実際に他のコンポーネントの上にある可能性があります。

誰にもアイデアはありますか?

ありがとう

4

3 に答える 3

5

nullレイアウトを使用する場合(そしてほとんどそうすべきではありません)、すべてのコンポーネントに境界を指定する必要があります。そうしないと、デフォルトで (0 x,0 y,0 width,0 height) になり、コンポーネントは表示されません。

BackgroundPanel bg = new BackgroundPanel();
cp.add(bg);

境界を提供していません。次のようなことをする必要があります:

BackgroundPanel bg = new BackgroundPanel();
bg.setBounds(100, 100, 100, 100);
cp.add(bg);

これにより、bgサイズが 100 x 100 になり、フレーム上で 100 x、100 y に配置されます。

于 2010-04-15T15:15:59.270 に答える
3

必要なすべての情報については、ルート ペインのドキュメントを参照してください。コンテンツ ペインだけでなく、レイヤード ペインとガラス ペインも利用できることに注意してください。

于 2010-04-15T13:43:01.670 に答える
2

デフォルトでは、すべてのコンポーネントのサイズは 0 です。コンポーネントにペイントを行ったからといって、コンポーネントのサイズが決まるわけではありません。サイズを設定する責任は引き続きあります。そのため、常にレイアウト マネージャーを使用する必要があります。このサイズのものはすべてあなたのために見てくれるので、心配する必要はありません。

初心者が常にレイアウトマネージャーを使用できないと考える理由がわかりません。はい、学習にはさらに数分かかりますが、長い目で見れば、多くの悲しみを救うことができます.

背景パネルは、いくつかのアプローチを示しています。繰り返しになりますが、どちらもレイアウトマネージャーを使用していると想定しているため、サイズを手動で設定する必要がある場合があります。

于 2010-04-15T15:14:42.047 に答える