2012-12-14 58 views
3

我有一個Jarame和一個JPanel,其中有一個帶有ImageIcon()的JLabel。一切工作完美,問題是我現在想要添加另一個JPanel與所有其他東西像按鈕等等的JFrame。但它仍然顯示背景圖像上方,而第二個JPanel則沒有顯示。一個框架中的多個JPanel /有一個支架圖像和另一個頂層組件的圖層

有人可以幫助我嗎? 這裏是我的代碼的摘錄:

JFrame window = new JFrame("Http Download"); 


/* 
* Background Section 
*/ 
JPanel panel1 = new JPanel(); 

JLabel lbl1 = new JLabel(); 


/* 
* Component Section 
*/ 
JPanel panel2 = new JPanel(); 

JLabel lbl2 = new JLabel(); 


/* 
* Dimension Section 
*/ 
Dimension windowSize = new Dimension(800, 600); 
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 

public HTTPDownloadGUI() { 

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    panel1.setLayout(null); 
    panel1.setSize(windowSize); 
    panel1.setOpaque(false); 

    panel2.setLayout(null); 
    panel2.setSize(windowSize); 
    panel2.setOpaque(false); 

    lbl1.setSize(windowSize); 
    lbl1.setLocation(0, 0); 
    lbl1.setIcon(new ImageIcon(getClass().getResource("bg1.png"))); 
    panel1.add(lbl1); 

    lbl2.setBounds(0, 0, 100, 100); 
    //lbl2.setIcon(new ImageIcon(getClass().getResource("bg2.png"))); 
    lbl2.setBackground(Color.GREEN); 
    panel2.add(lbl2); 

    panel1.add(panel2); 

    window.add(panel1); 

    int X = (screen.width/2) - (windowSize.width/2); 
    int Y = (screen.height/2) - (windowSize.height/2); 

    window.setBounds(X,Y , windowSize.width, windowSize.height); 
    window.setVisible(true); 

} 

回答

2
  1. 避免空的佈局,這裏比較麻煩那麼他們是值得
  2. 設置框架佈局BorderLayout
  3. 標籤添加到幀
  4. 將標籤佈局設置爲BorderLayout
  5. 創建面板並將其不透明屬性設置爲false
  6. 其它組分添加到按照正常
  7. 面板添加到標籤

結帳

對於實施例

更新與例如

  • panel1爲主要背景...
  • 設置panel1的佈局BorderLayout
  • 添加lbl1panel1
  • 設置lbl1的佈局BorderLayout
  • 套裝panel2的佈局,以至於你想用什麼......
  • 設置panel2的不透明度屬性falsepanel2.setOpacity(false)
  • 添加lbl2panel2
  • 添加panel2lbl1
  • 添加panel1到每一個你想要的。

enter image description here

public class TestLayout17 { 

    public static void main(String[] args) { 
     new TestLayout17(); 
    } 

    public TestLayout17() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     /* 
     * Background Section 
     */ 
     JPanel panel1 = new JPanel(); 
     JLabel lbl1 = new JLabel(); 
     /* 
     * Component Section 
     */ 
     JPanel panel2 = new JPanel(); 
     JLabel lbl2 = new JLabel(); 
     /* 
     * Dimension Section 
     */ 
     Dimension windowSize = new Dimension(800, 600); 
     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 

     public TestPane() { 

      setLayout(new BorderLayout()); 

      panel1.setLayout(new BorderLayout()); 

      lbl1.setLayout(new BorderLayout()); 
      URL url = getClass().getResource("/bg1.gif"); 
      System.out.println(url); 
      try { 
       BufferedImage image = ImageIO.read(url); 
       Image smaller = image.getScaledInstance(-1, image.getHeight()/2, Image.SCALE_SMOOTH); 
       lbl1.setIcon(new ImageIcon(smaller)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
//   lbl1.setIcon(new ImageIcon(url)); 
      panel1.add(lbl1); 

      add(panel1); 

      panel2.setLayout(new GridBagLayout()); 
      panel2.setOpaque(false); 

      lbl2.setBorder(new EmptyBorder(8, 8, 8, 8)); 
      lbl2.setBackground(Color.GREEN); 
      lbl2.setText("Say hello");; 
      lbl2.setOpaque(true); 
      panel2.add(lbl2); 

      lbl1.add(panel2); 

     } 
    } 
} 
+0

哪些標籤,以及哪個框架和哪個面板是您的意思?你可以嘗試多解釋一下嗎? – user1905203

+0

更新了例子... – MadProgrammer

+0

太棒了,它完美的作品。我的錯誤是,我將panel2添加到panel1而不是label1。感謝兄弟們的幫助! – user1905203

0

我勸你聽從MadProgrammer的建議。如果您選擇採用空白布局,請確保刪除以前的JPanel並將新的內容添加到內容窗格window.setContentPane(panel2);並呼叫window.repaint()

1

對於panel2沒有任何內容顯示的原因是因爲沒有任何內容需要顯示。簡單地設置文本lbl2將顯示該JPanel本身是可見的:

JLabel lbl2 = new JLabel("Some text"); 

我會,但是建議不要使用null佈局,因爲它中的開銷對開發商設置位置&尺寸其中layout manager可以輕鬆管理您。

+0

也不起作用 – user1905203

相關問題