2014-10-27 130 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