如何将JLabel放在JFrame中的特定位置?

时间:2015-12-04 00:27:48

标签: java swing jframe jlabel

我们即将创建一个基于在线的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的方法,只需将每个坐标映射到相应的单元格。

0 个答案:

没有答案