2013-10-15 35 views
1

我有一個JFrame,它使用背景圖像作爲內容窗格。我成功地做了我有一個ImagePanel類。但是,當我嘗試添加其他組件時,這些組件不顯示。我想這是關於Z順序,所以我試圖設置標籤的Z順序,但它給了我一個錯誤。設置組件Z訂單結果爲非法位置

frame.setContentPane(new ImagePanel(bg)); 
frame.setBackground(new Color(0,255,0,0)); 
frame.getContentPane().setComponentZOrder(jLabel1, 1); 
frame.setVisible(true); 

唯一的例外是:

java.lang.IllegalArgumentException: illegal component position 

當我嘗試到Z順序更改爲0,它給了我一個不同的錯誤

frame.getContentPane().setComponentZOrder(jLabel1, 0); 

的錯誤是:

java.lang.IllegalArgumentException: component and container should be in the same top-level window 

回答

1

因爲您沒有將標籤添加到框架中,您將獲得例外。但是,使用ZOorder不是解決問題的方法。

相反,您應該將JLabel添加到ImagePanel。

ImagePanel panel = new ImagePanel(bg); 
panel.setLayout(...); 
panel.add(label); 
frame.setContentPane(panel); 
+0

我明白了......我忘記了內容窗格是您放置組件的地方,謝謝! – danieljohngomez

0

你基本上從不想替換co幀的mponent窗格中,但將組件添加到它:

frame.add(jLabel1); // I assume this is included in your code 
ImagePanel image = new ImagePanel(bg) 
frame.add(image); 
frame.getContentPane().setComponentZOrder(jLabel1, 1); 
frame.getContentPane().setBackground(new Color(0,255,0,0)); 
frame.setVisible(true); 

我還添加了一些.getContentPane(),以確保所有的方法是相對於內容窗格中,而不是框架,因爲不是所有的方法都被重定向。

請閱讀JFrame和JFrame.setContentPane的Javadoc以獲取更多信息。

+0

既然JDK5就沒有必要使用的getContentPane()。 – camickr

+0

@camickr至少get/setComponentZOrder方法不會被JFrame覆蓋,所以它們將在框架的組件上運行,而不是根窗格的組件。 – Njol

+0

好點,但它應該是「內容」而不是「組件」。 – camickr

0

您還沒有發佈完整的代碼找問題,但這裏是Z順序的簡單演示:

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class NewClass extends JFrame { 
    public NewClass(){ 
     super("Test"); 
     setSize(200, 200); 

     JPanel panel = new JPanel(); 
     setContentPane(panel); 

     JButton button1 = new JButton("Button 1"); 
     JButton button2 = new JButton("Button 2"); 
     JButton button3 = new JButton("Button 3"); 

     button1.setBounds(10, 10, 100, 40); 
     button2.setBounds(5, 5, 100, 30); 
     button3.setBounds(15, 15, 150, 40); 

     panel.setLayout(null); 

     panel.add(button1); 
     panel.add(button2); 
     panel.add(button3); 

     panel.setComponentZOrder(button1, 1); 
     panel.setComponentZOrder(button2, 0); 
     panel.setComponentZOrder(button3, 2); 

     // OR to swap z order of buttons, try below 
     // panel.setComponentZOrder(button1, 0); 
     // panel.setComponentZOrder(button2, 1); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String [] args){ 
     new NewClass(); 
    } 
} 
相關問題