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

4
我是一个新手,对于java(和编程一般)一窍不通,我正在尝试制作我的第一个程序。我已经被同一个问题困扰了五个小时了,所以我决定寻求帮助。
基本上,我正在尝试制作一个程序(2d游戏),板上有大约20个位置。每个位置都是蓝色的(由玩家1拥有),红色的(由玩家2拥有)或黑色的(没有人拥有)。
我在主函数中放置了一个调用设置游戏方法的方法,然后是一个播放游戏的方法。我正在处理设置游戏,基本上它只是制作了一个 Background 类的对象(继承自 JPanel,并覆盖 paintComponent() 方法)和20个 Position 类的对象(继承自 JPanel,并覆盖 paintComponent() 方法)。
到目前为止,我卡在了把这些 Position 对象放在 Background 对象之上的地方。
当我这样做时:
Background background= new Background();
frame.getContentPane().add(background);
Position position1= new Position;
frame.getContentPane().add(position1);
frame.setVisible(true);

我的问题是,当我先添加位置(position)然后添加背景(background)时,只有背景没有圆圈。希望能同时显示圆圈和背景。

我是新手,对Java还不熟悉,虽然尝试搜索了很多解决方案,如先将位置添加到背景,然后再将背景添加到框架中等等,但仍无法解决。

我知道我同时添加它们到框架中的方法很可能是完全错误的,但我这样写是为了确保我的每个类在屏幕上都能画出东西。

PS: 我没有复制我的代码,因为大部分变量和方法名都不是用英语,所以阅读起来相当困难,如果您仍认为需要,我可以添加它。对于我的愚蠢问题,我很抱歉,但我现在真的感到困惑,不知道该尝试什么。

5个回答

2

基本上我正在尝试制作一个有大约20个位置的程序(2D游戏)。

每个位置都是蓝色(由玩家1拥有),红色(由玩家2拥有)或黑色(无人拥有)。

  1. Swing中的绘画默认情况下从不返回PreferredSize,需要覆盖getPreferredSize()

  2. JPanel在API中实现了FlowLayout,这个LayoutManager只接受PreferredSize来自于添加到此容器中的JComponents

  3. 做出上述更改后,发布一个SSCCE,即短小、可运行、可编译的示例代码


这太棒了,谢谢,虽然它没有完全解决我的问题,因为它显示的圆圈位置不正确,而且只显示了1/4的圆圈而不是整个圆圈,但至少它显示了一些东西。从现在开始,我将尝试自己找出问题所在,如果我无法解决,那么我将发布SSCCE。 再次感谢。 :D - user2116860

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

默认情况下,JFrame使用边框布局(BorderLayout)。同样,默认情况下,当您向使用边框布局的容器添加组件时,该组件将添加到中心(CENTER)。只能添加一个组件到中心,因此您的Position组件将替换Background组件。

您希望将Position添加到Background,然后再将Background添加到框架(frame)中。类似于:

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

注意:当向框架添加组件时,无需使用getContentPane()。

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

或其他什么东西,


0
尝试使用类似以下的内容:
jPanelExampleName.validate();
jPanelExampleName.repaint();

在添加了您的JPanels之后。

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,不确定哪种最适合您)。您可以在这里找到最适合您的布局和一些示例代码。同时,只需设置默认关闭操作即可。

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 );

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接