2014-10-27 123 views
1

我試圖將這兩個JPanel添加到JFrame,但只有幀顯示和沒有添加任何內容。任何人都可以幫助我,我缺少什麼來添加這些面板?試圖將多個JPanel添加到JFrame

import javax.swing.*; 
import java.awt.GridLayout; 

public class grid_Base extends JFrame { 

    JFrame mainp = new JFrame(); 
    JPanel p = new JPanel(); 
    JPanel p2 = new JPanel(); 
    clickButtons buttons[] = new clickButtons[100]; 

    public grid_Base() { 

     super("Battleship"); 
     mainp.setSize(800, 1500); 
     mainp.setResizable(true); 
     mainp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainp.setVisible(true); 

     p.setLayout(new GridLayout(10, 10)); 
     for (int i = 0; i < 100; i++) { 
      buttons[i] = new clickButtons(); 
      p.add(buttons[i]); 
     } 
     mainp.add(p); 

     p2.setLayout(new GridLayout(10, 10)); 
     for (int i = 0; i < 100; i++) { 
      buttons[i] = new clickButtons(); 
      p2.add(buttons[i]); 
     } 
     mainp.add(p2); 

    } 
} 

回答

2
  1. 總是調用setVisible(true);最後,您已經創建後您的UI
  2. JFrame使用BorderLayout因爲它的默認佈局,因此使用mainp.add(p)然後mainp.add(p2)會隱藏p,因爲只有p2將進行佈局。 ..
  3. 不要從JFrame(特別是因爲你已經有一個實例字段JFrame),這隻會使它更混亂...
  4. 通過Code Conventions for the Java TM Programming Language有一個閱讀,它會讓人們更容易閱讀您的代碼,併爲您閱讀其他人
  5. 您的第二個循環覆蓋第一個循環生成的內容,這意味着當您嘗試找到按鈕,您將只能找到在第二個循環中創建的按鈕,而不是第一個....
-1

您可以對代碼進行這些更改,以便您可以看到面板。將值更改爲您的要求。

mainp.getContentPane().setLayout(null); //<=== New line 
    p.setLayout(new GridLayout(10, 10)); 
    p.setBounds(10,10,390,1300); //<=== position of panel1 
    p.setBorder(BorderFactory.createTitledBorder("Panel1")); // border 
    mainp.add(p); 
    .... 
    p2.setLayout(new GridLayout(10, 10)); 
    p2.setBounds(400,10,380,1300); //<=== position of panel2 
    p2.setBorder(BorderFactory.createTitledBorder("Panel2")); //border   
    mainp.add(p2); 
+1

避免使用'null'佈局,像素完美的佈局是現代UI設計中的幻想。影響組件的個體大小的因素太多,其中沒有一個可以控制。 Swing旨在與佈局經理一起工作,放棄這些將導致無法結束的問題和問題,您將花費越來越多的時間來嘗試糾正。看看[爲什麼不喜歡在SWING中使用空佈局?](http://stackoverflow.com/questions/6592468/why-is-it-frowned-upon-to-use-a-null-佈局在擺動)更多細節 – MadProgrammer 2014-10-27 05:42:42