この質問はよく聞かれますが、どこでも答えが不足しています。次のように、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を表示する必要があります(したがって、透明(??))赤い四角が表示されるため、背景が実際に他のコンポーネントの上にある可能性があります。
誰にもアイデアはありますか?
ありがとう