Java 一个框架中的两个面板

Java 一个框架中的两个面板,java,swing,layout,jframe,jpanel,Java,Swing,Layout,Jframe,Jpanel,我知道以前有很多关于这个主题的话题,我也曾广泛使用谷歌来解决这个问题,但无论我做什么,我都无法在一个JFrame中显示两个面板。我尝试过很多东西,包括卡片布局,但似乎都不起作用。我觉得这是一个非常简单的解决办法 目的是查看由于随机定位而导致的两个面板之间的差异 以下是一些java文件(仅相关代码-还有一个Snowman.java,但它只是提供了类似于ghost.java的雪人绘图): Ghost.java import java.awt.*; public class Ghost { priv

我知道以前有很多关于这个主题的话题,我也曾广泛使用谷歌来解决这个问题,但无论我做什么,我都无法在一个JFrame中显示两个面板。我尝试过很多东西,包括卡片布局,但似乎都不起作用。我觉得这是一个非常简单的解决办法

目的是查看由于随机定位而导致的两个面板之间的差异

以下是一些java文件(仅相关代码-还有一个Snowman.java,但它只是提供了类似于ghost.java的雪人绘图):

Ghost.java

import java.awt.*;

public class Ghost
{
private int x, y;
private String name;
private boolean happy;
private Color color;

public Ghost (Color shade, int upperX, int upperY, String a, boolean b)
{
  color = shade;
  x = upperX;
  y = upperY;
  name = a;
  happy = b;
}   

public void draw (Graphics page)
{
  page.setColor(color);
  page.fillOval (x, y, 50, 125);
  page.fillRect (x+1, y+60, 49, 75); // body of ghost

  page.setColor(Color.black);
  page.fillOval (x+12, y+10, 8, 8);
  page.fillOval (x+32, y+10, 8, 8); // eyes

  page.setColor(Color.white);
  page.drawString(name, x+8, y-5); // name

  page.setColor(Color.black);
  if (happy == true)
     page.fillArc  (x+10, y+30, 33, 10, 180, 180);
  else
     page.fillArc  (x+10, y+30, 33, 10, 0, 180); // smile/frown
}     

public void setColor (Color shade)
{
  color = shade;
}

public void setX (int upperX)
{
  x = upperX;
}

public void setY (int upperY)
{
  y = upperY;
}
HalloweenPanel.java:

import javax.swing.*;   
import java.awt.*;
import java.util.Random;

public class HalloweenPanel extends JPanel
{
 private Ghost ghost1, ghost2, ghost3;
 private Snowman snowman1, snowman2;

 public HalloweenPanel()
 {
  setBackground (Color.black);

  Random rand = new Random();
  int randomX = rand.nextInt(700)+50;
  int randomY = rand.nextInt(400)+50;
  boolean randomHappy = (Math.random() < 0.5);
  boolean randomHappy2 = (Math.random() < 0.5);

  ghost1 = new Ghost (Color.white, randomX, randomY, "Scary", randomHappy2);
  ghost2 = new Ghost (Color.blue, randomX, 100, "Happy", true);
  ghost3 = new Ghost (Color.yellow, 300, randomY, "Scared", randomHappy);

  snowman1 = new Snowman (500, 50);
  snowman2 = new Snowman (750, 100);  
  }

  public void paintComponent (Graphics page)
  {
  Random rand = new Random();
  int randomX2 = rand.nextInt(900);
  int randomY2 = rand.nextInt(500);
  super.paintComponent(page);
  ghost2.setX(randomX2);
  ghost3.setY(randomY2);
  ghost1.draw(page);
  ghost2.draw(page);
  ghost3.draw(page);
  snowman1.draw(page);
  snowman2.draw(page);
 }
}
您正在尝试将两个面板添加到BorderLayout的中心。这是办不到的

尝试:

看看有什么不同

如果这不是您想要的,请尝试其他布局管理器。阅读上的Swing教程

或者,如果要将两个面板堆叠在另一个面板上(在Z轴上),请尝试使用
overlylayout
。本教程没有介绍这一点,因此您需要了解API。您还需要将“顶部”面板设置为非不透明(),这样它就不会在底部面板的顶部进行绘制

您正在尝试将两个面板添加到BorderLayout的中心。这是办不到的

尝试:

看看有什么不同

如果这不是您想要的,请尝试其他布局管理器。阅读上的Swing教程


或者,如果要将两个面板堆叠在另一个面板上(在Z轴上),请尝试使用
overlylayout
。本教程没有介绍这一点,因此您需要了解API。你还需要制作“顶部”面板NoopopaWe(),这样它就不会画在底部面板的顶部。

不要忘记调用Suff.PruttCe组件,而不是使用StestApple大小,你应该考虑重写GeasPrimeResithMead方法,不要忘记调用Suff.PruttCe组件,而不是使用StaseReldSead,您应该考虑重写GETApple Read Stand方法,谢谢您的评论。我尝试添加边框布局,现在它们都显示出来了。但是,顶部面板的空间比底部面板小得多,因此一些对象无法正确显示。如何使两个面板具有相同的尺寸?我查看了OverlyLayout,并尝试为它制作一个新的容器,但它有点将两者啮合在一起。我对java非常陌生,也是这方面的学生,所以请原谅我。再次感谢!好的,给你+1。谢谢你的教训!:)阅读有关BorderLayout如何工作的教程。您的屏幕大小可能不够大,无法同时显示这两个组件,因此南部得到其首选的大小,而中部得到剩余的大小。如果希望它们的大小相等,请使用
GridLayout
。同样,教程是您的朋友<代码>我对java非常陌生,并且是这方面的学生——这就是为什么我给了你一个到教程的链接。你需要花点时间阅读它来理解Swing的基本知识。我想我已经把它都弄明白了。我编辑了上面的代码以反映我目前拥有的。我去掉了那件衣服。对于gridlayout,我制作了一行和0列,以使它们处于相同的级别,因为当我制作了一列和0行时,我仍然有相同的问题,但我认为这是我15年的问题“屏幕大小,而不是代码的错误。当它们位于一行时,所有对象始终可见。顺便说一句,只要反复运行程序,就会发现随机并不是真正的随机,因为很多时候x和y的位置是相同的。再次感谢你的帮助!谢谢你的评论。我尝试添加边框布局,现在它们都显示出来了。但是,顶部面板的空间比底部面板小得多,因此一些对象无法正确显示。如何使两个面板具有相同的尺寸?我查看了OverlyLayout,并尝试为它制作一个新的容器,但它有点将两者啮合在一起。我对java非常陌生,也是这方面的学生,所以请原谅我。再次感谢!好的,给你+1。谢谢你的教训!:)阅读有关BorderLayout如何工作的教程。您的屏幕大小可能不够大,无法同时显示这两个组件,因此南部得到其首选的大小,而中部得到剩余的大小。如果希望它们的大小相等,请使用
GridLayout
。同样,教程是您的朋友<代码>我对java非常陌生,并且是这方面的学生——这就是为什么我给了你一个到教程的链接。你需要花点时间阅读它来理解Swing的基本知识。我想我已经把它都弄明白了。我编辑了上面的代码以反映我目前拥有的。我去掉了那件衣服。对于gridlayout,我制作了一行和0列,以使它们处于相同的级别,因为当我制作了一列和0行时,我仍然有相同的问题,但我认为这是我15年的问题“屏幕大小,而不是代码的错误。当它们位于一行时,所有对象始终可见。顺便说一句,只要反复运行程序,就会发现随机并不是真正的随机,因为很多时候x和y的位置是相同的。再次感谢你的帮助!
import javax.swing.*;
import java.awt.*;

public class HalloweenDriver
{
public static void main (String[] args)
 {
  JFrame frame = new JFrame ("Halloween - Winter is Coming..");
  frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

  JPanel mainPanel = new JPanel();
  HalloweenPanel panel = new HalloweenPanel();
  HalloweenPanel panel2 = new HalloweenPanel();

  mainPanel.setLayout(new GridLayout(1,0));

  mainPanel.add(panel);
  mainPanel.add(panel2);

  frame.add(mainPanel);

  frame.pack();
  frame.setVisible(true);
 }
}   
frame.getContentPane().add(panel);
frame.getContentPane().add(panel2);
frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.getContentPane().add(panel2, BorderLayout.SOUTH);