[英]Background image in a JFrame
這個問題已經問了很多,但是到處都是答案。 我可以通過擴展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);
時,它顯示為紅色cp.setLayout(null);
,則顯示背景,但不顯示其他組件。 我猜想這與沒有由null LayoutManager調用的paintComponent有關,但是我完全不熟悉LayoutManager的工作方式(這是一個專為大學設計的項目,作業明確指出不要使用LayoutManager) 。
當我制作圖像時,背景必須顯示為空(因此,透明色(??))會顯示紅色方塊,因此背景可能實際上在我的其他組件上方。
有誰有任何想法嗎?
謝謝
當使用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處。
在根窗格上的文檔中查找所需的所有信息。 注意分層窗格和玻璃窗格以及內容窗格的可用性。
默認情況下,所有組件的大小均為0。 僅僅因為您在組件上進行繪畫不會賦予組件大小。 您仍然負責設置大小。 這就是為什么您應該始終使用布局管理器的原因。 它會為您照顧所有這些大小的東西,因此您不必擔心。
我不知道為什么新手總是認為他們不能使用布局管理器。 是的,學習需要花費更多時間,但從長遠來看,它可以節省很多麻煩。
背景面板顯示了幾種方法。 同樣,它們都假定您使用布局管理器,因此您可能需要手動設置大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.