我们即将创建一个基于在线的Space Invaders游戏,其中包含已实现的图形。我一直在阅读有关JFrames,JPanels和JLabel的内容,以便创建一个带有网格的窗口,其中将放置船只和怪物。
所以,这就是问题,我一直在寻找存在的不同布局,但似乎没有什么能够符合我们的目的。我想要一个简单的JFrame,可以将JLabel对象放在某个位置(使用setBounds(),setLocation()或类似的东西)。这需要setLayout(null),我听说这不是一个好的解决方案?我想到的物体尺寸固定为30x30像素,固定窗口尺寸为600x600px(给我一个20 * 20的网格)。
无论如何,我一直试图让它与setLayout(null)一起使用,但没有任何结果。如果我应用一个布局,比如说FlowLayout,那么该船是可见的,但是卡在LEFT,CENTER或MIDDLE中。
public class GUI extends JFrame {
JPanel p = new JPanel(null);
public GUI() {
try{
this.setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("graphics/bg.png")))));
}catch(IOException e) {
System.out.println("Image does not exist");
}
this.setLayout(null);
this.setResizable(false);
this.setSize(600,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void placeShip1() {
ImageIcon ship2 = new ImageIcon("graphics/ship2.png");
JLabel imageLabel = new JLabel(ship2);
imageLabel.setBounds(200,200,30,30);
p.add(imageLabel);
p.setOpaque(false);
p.setSize(600, 600);
this.add(p);
this.setVisible(true);
}
}
我真的不明白为什么它不起作用。我的意思是,我想要的只是带有背景图像的JFrame和某个位置上的对象,但是对象根本不显示。
想要使用setLayout(null)的主要原因是因为我正在考虑使用将网格坐标转换为JFrame的方法,只需将每个坐标映射到相应的单元格。