如何将JPanel放在另一个JPanel上?

时间:2013-02-27 20:05:55

标签: java swing jpanel

我是java的新手(以及一般的编程),我正在尝试制作我的第一个程序。我现在约5个小时就遇到了同样的问题,所以我决定寻求帮助。

基本上我正在尝试制作一个在棋盘上有大约20个位置的程序(2d游戏)。每个位置都是蓝色(由player1拥有),红色(由player2拥有)或黑色(不是任何人拥有)。

我正在进行的方式主要是我提出了一种调用设置游戏的方法,然后是一种玩游戏的方法。我正在开发设置游戏,基本上它所做的只是它创建了一个类Background(扩展JPanel,并覆盖paintComponent())和类Position的20个对象的对象(扩展JPanel,并覆盖paintComponent())。

到目前为止,我一直坚持将这些Position对象放在Background对象之上。

当我这样做时:

Background background= new Background();
frame.getContentPane().add(background);
Position position1= new Position;
frame.getContentPane().add(position1);
frame.setVisible(true);

它只显示一个圆圈而没有我希望的背景,如果我先添加位置然后再添加背景,我只有背景而没有圆圈。

无论如何我是java的新手,我仍然无法找到自己的方式,但是我试图寻找解决方案,并且我已经找到了许多不同的解决方案来解决这个问题(例如向后台添加位置)首先,然后添加背景到框架等)但我无法使它们中的任何一个工作。

我知道我将它们添加到帧中的方式(很可能)是完全错误的,但是我这样写了所以你希望(希望)确保我写的实际上确实告诉你我的每个类的代码在屏幕上绘制一些内容。

PS:我没有在这里复制我的代码,因为大多数变量和方法名称都不是英文的,所以它很难阅读,但如果你仍然认为它需要,我会添加它。另外我很抱歉我可能有些愚蠢的问题,但我在这里碰壁,我不知道还有什么可以尝试。

5 个答案:

答案 0 :(得分:2)

  

基本上我正在尝试制作一个大约20个的程序(2d游戏)   董事会成员。每个职位都是蓝色的(由...拥有)   player1),红色(由player2拥有)或黑色(不属于任何人)。

    默认情况下,
  1. Painting in Swing永远不会返回PreferredSize,需要to override getPreferedSize()

  2. JPanel已在API中实施FlowLayout,此LayoutManager accepting only PreferredSize来自JComponents添加到此容器

  3. 在上午更改后发布SSCCE,简短,可运行,可编辑

答案 1 :(得分:1)

Background background= new Background();
frame.getContentPane().add(background);
Position position1= new Position;
frame.getContentPane().add(position1);

默认情况下,JFrame使用BorderLayout。此外,默认情况下,当您将组件添加到使用BorderLayout的Container时,comopnent将添加到CENTER中。只有一个组件可以添加到CENTER中,因此您的位置组件将替换背景组件。

您想要将位置添加到背景,然后将背景添加到框架。类似的东西:

Background background= new Background();
Position position1= new Position;
background.add(position1);
frame.add(background);

注意:在向框架添加组件时不需要使用getContentPane()。

答案 2 :(得分:0)

根面板应该是一个JFrame,下面有一个Container类。当您调用someRoot.window.container = yourJPanel时,它会将JPanel加载为JFrame的主要组件视图。请注意,JFrame只能容纳一个JPanel,但其他JPanel可以容纳其他JPanel。就像您将初始JPanel添加到JFRam一样,JPanel自己的容器也可以是另一个JPanel。希望这会有所帮助。

像这样:

JPanel temp = new JPAnel();
frame.getContentPane().add(temp);
temp.getContentPane().add(new JPanel());

在这些添加之后,有一个命令可以解释我,但是你调用JFrame来让它实时刷新。我认为它是这样的:

frame.validate();  //thanks @SMT

或其他什么,

答案 3 :(得分:0)

尝试使用类似

的内容
jPanelExampleName.validate();
jPanelExampleName.repaint();

添加JPanel后。

答案 4 :(得分:0)

听起来你想要使用一个JFrame并将JPanels附加到它上面。这就是我个人会这样做的。

声明你的JFrame和JPanels

JFrame frame1 = new JFrame( "App Name");
JPanel panel1 = new JPanel(); 
JPanel panel2 = new JPanel(); 
JPanel panel3 = new JPanel(); 
JPanel panel4 = new JPanel(); 

设置背景(我正在使用颜色,但你明白了)

panel1.setBackground(Color.orange);
panel2.setBackground(Color.orange);
panel3.setBackground(Color.orange);
panel4.setBackground(Color.orange);

设置JFrame的布局(我使用BoxLayout不确定哪种方式最适合你)你可以找到最合适的一个和一些示例代码here.也只需设置默认的关闭操作。

frame1.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame1.setLayout( new BoxLayout( frame1.getContentPane(), BoxLayout.Y_AXIS ) );

然后只需附上你的JPanels

frame1.add( panel1);
frame1.add( panel2);
frame1.add( panel3);
frame1.add( panel4);
frame1.pack();
frame1.setVisible( true );

这将允许您使用您创建的JPanel,然后通过其他方法更改颜色。