4

我是 Java 新手(和一般编程),我正在尝试制作我的第一个程序。我现在在同一个问题上停留了大约 5 个小时,所以我决定寻求帮助。

基本上我正在尝试制作一个在板上有大约 20 个位置的程序(2d 游戏)。每个位置都是蓝色(玩家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);

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

无论如何,我是 Java 新手,但我仍然无法找到解决方法,但是我尝试寻找解决方案,并且我找到了许多不同的解决方案来解决这个问题(例如首先将位置添加到背景,以及然后将背景添加到框架等),但我无法让它们中的任何一个工作。

我知道我将它们都添加到框架的方式(很可能)是完全错误的,但我是这样写的,所以你会(希望)确保我写的内容确实向你展示了我的代码这些类中的一些在屏幕上绘制了一些东西。

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

4

5 回答 5

2

基本上我正在尝试制作一个在板上有大约 20 个位置的程序(2d 游戏)。每个位置都是蓝色(玩家1拥有)、红色(玩家2拥有)或黑色(不属于任何人)。

  1. 默认情况下在 Swing 中绘画永远不会返回PreferredSize,需要覆盖 getPreferedSize()

  2. JPanelFlowLayout在 API 中实现,此LayoutManager 仅接受 PreferredSize来自添加到此容器的JComponents

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

于 2013-02-27T20:13:08.853 回答
1
Background background= new Background();
frame.getContentPane().add(background);
Position position1= new Position;
frame.getContentPane().add(position1);

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

您想将位置添加到背景,然后将背景添加到框架。就像是:

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

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

于 2013-02-27T20:41:53.590 回答
0

听起来您想使用一个 JFrame 并将 JPanel 附加到它。这就是我个人的做法。

声明你的 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 ) );

然后只需附加您的 JPanel

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

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

于 2013-02-27T20:56:19.367 回答
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

或者其他的东西,

于 2013-02-27T20:12:29.193 回答
0

尝试使用类似的东西

jPanelExampleName.validate();
jPanelExampleName.repaint();

添加您的 JPanel 后。

于 2013-02-27T20:12:55.500 回答