我正在尝试创建一个简单的游戏,其中一个盒子(外星人)在每一行(从左到右/从右到左)移动,然后向下移动并在鼠标中单击,将有一个球(火),当盒子和球相遇,玩家获胜,否则外星人入侵了星球。
我从这里得到了游戏的想法
[http://www.stanford.edu/class/cs106a/cgi-bin/classhandouts/23-ufo-game.pdf][1]
斯坦福大学演讲
[1]:
所以我试着用我的代码做这样的事情。
package spaceInvader;
import javax.swing.JFrame;
public class Main {
public static void main(String args[]) throws InterruptedException{
JFrame jf = new JFrame("YY");
Space_GUI sg = new Space_GUI();
jf.add(sg);
jf.setSize(500,500);
jf.setVisible(true);
jf.setContentPane(sg);
Thread.sleep(2000);
sg.rc.move();
}
}
package spaceInvader;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Space_GUI extends JPanel{
public RectangleComponent rc;
public Space_GUI(){
rc = new RectangleComponent();
add(rc);
}
}
package spaceInvader;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
public class RectangleComponent extends JComponent{
private int _xCoord;
private int _yCoord;
private static final int SIZE = 50;
public RectangleComponent(){
_xCoord = 10;
_yCoord = 10;
repaint();
}
public void move(){
_xCoord = 20;
_yCoord = 20;
repaint();
}
public void paintComponent(Graphics g){
_xCoord = getWidth()/2;
_yCoord = getHeight()/2;
super.paintComponent(g);
g.setColor(Color.black);
g.drawRect(_xCoord, _yCoord, SIZE, SIZE);
g.fillRect(_xCoord, _yCoord, SIZE, SIZE);
}
}
在我的代码中,我试图仅显示该框,但是没有任何显示。我尝试添加JButton,但仅该按钮显示,它不显示该框。
最佳答案
出于某种原因,我现在看到的是RectangleComponent代码,可以看到问题:
RectangleComponent扩展了JComponent,并且JComponent的preferredSize是[0,0],因此,如果您对此不进行任何操作,则当然不会显示任何内容。
一种解决方案是为RectangleComponent提供一个getPreferredSize方法,该方法告知布局管理器应为多少大小。
另一个可能的解决方案是对持有RectangleComponent对象的Space_GUI JPanel使用不同的布局管理器。例如,如果您使用BorderLayout并添加了RectangleComponent BorderLayout.CENTER,则RectangleComponent将填充Space_GUI JPanel。
另一个问题是,您要小心设置_xCoord和_yCoord变量,然后在move()中对其进行更改,但这是徒劳的,因为在RectangleComponent的paintComponent方法中将它们设置为完全不同的东西。