可以参考 JDK 的 API,里面有一段:
 JFrame 类与 Frame 轻微不兼容。与其他所有 JFC/Swing 顶层容器一样,JFrame 包含一个 JRootPane 作为其唯一的子容器。根据规定,根窗格所提供的内容窗格应该包含 JFrame 所显示的所有非菜单组件。这不同于 AWT Frame。为了方便地使用 add 及其变体,已经重写了 remove 和 setLayout,以在必要时将其转发到 contentPane。这意味着可以编写:       frame.add(child);
 子级将被添加到 contentPane。内容窗格始终是非 null 的。试图将其设置为 null 会导致 JFrame 抛出异常。默认的内容窗格上会设置有 BorderLayout 管理器。有关添加、移除和设置 JFrame 的 LayoutManager 的详细信息,请参阅 RootPaneContainer。 

解决方案 »

  1.   

    我直接在主类的构造函数中定义该面板sp  然后再this.add(sp.jp)  最后在主函数中初始化该类的一个对象  但是显示是这样的
    不知道是哪里出问题了
      

  2.   

    布局问题,你没有布局好,再调整调整就好了jp1.setBounds(0, 0,500, 400);我这边用了500 400 不可能会出现那么小的黑框啊
      

  3.   

    布局调整最烦人了,我找了半天没找到你的问题在哪里,你这个代码的写法挺不适应,就给你写了一个,算是调出来了,你参考参考吧import java.awt.BorderLayout;
    import java.awt.Color;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;public class SnakeMain extends JFrame
    {
    private JPanel jPanel1; //活动范围
    private JPanel jPanel2; //信息记录

    private JLabel jLabel1; //等级标签
    private JLabel jLabel2; //分数标签

    private JTextField jTextField1; //等级显示框
    private JTextField jTextField2; //分数显示框

    public SnakeMain()
    {
    jLabel1 = new JLabel("等级");
    jLabel2 = new JLabel("分数");
    jTextField1 = new JTextField(5);
    jTextField2 = new JTextField(5);

    jPanel2 = new JPanel();
    jPanel2.add(jLabel1);
    jPanel2.add(jTextField1);
    jPanel2.add(jLabel2);
    jPanel2.add(jTextField2);

    jPanel1 = new JPanel();
    jPanel1.setSize(400, 400);
    jPanel2.setSize(400, 400);
    jPanel1.setBackground(Color.BLACK);

    this.add(jPanel1,BorderLayout.CENTER);
    this.add(jPanel2,BorderLayout.EAST);

    this.setSize(800, 400);
    this.setVisible(true);
    }
    public static void main(String[] args)
    {
    new SnakeMain();
    }
    }