Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JLabel放置在JFrame中的特定位置?_Java_Swing_Jframe_Jlabel - Fatal编程技术网

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

Java 如何将JLabel放置在JFrame中的特定位置?,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,我们将要创建一个基于在线的空间入侵者游戏,带有实现的图形。我一直在阅读关于JFrames、JPanels和JLabels的文章,目的是创建一个带有网格的窗口,在其中放置船只和怪物 所以,事情是这样的,我一直在浏览现有的不同布局,但似乎没有什么真正符合我们的目的。我想要一个简单的JFrame,可以将JLabel对象放置在某个位置(使用setBounds()、setLocation()或类似的东西)。这需要setLayout(null),我听说这不是一个好的解决方案?我想让对象的大小固定为30x30

我们将要创建一个基于在线的空间入侵者游戏,带有实现的图形。我一直在阅读关于JFrames、JPanels和JLabels的文章,目的是创建一个带有网格的窗口,在其中放置船只和怪物

所以,事情是这样的,我一直在浏览现有的不同布局,但似乎没有什么真正符合我们的目的。我想要一个简单的JFrame,可以将JLabel对象放置在某个位置(使用setBounds()、setLocation()或类似的东西)。这需要setLayout(null),我听说这不是一个好的解决方案?我想让对象的大小固定为30x30px,窗口大小固定为600x600px(给我一个20*20的网格)

无论如何,我一直试图让它与setLayout(null)一起工作,但没有任何结果。如果我应用一个布局,比如FlowLayout,船是可见的,但卡在左边、中间或中间

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,只需将每个坐标映射到相应的单元格

“我们将要创建一个基于在线的空间入侵者游戏,带有实现的图形”-这自动向我建议,您不想使用
JLabel
或任何其他组件(除了
JPanel
作为主渲染面),而是要开始学习如何执行自定义绘制,这将给你更多的控制权(并且问题更少)。首先看一看,了解更多详细信息您遇到的问题很大程度上取决于布局管理API的工作方式,因此,删除它后,您将开始遇到其他问题。通常,在更改UI后,您会使用
revalidate
repaint
,但是
revalidate
与布局管理API相关。另外,我看不到您正在使用的
placeShip1
非常感谢!我怀疑是这样的,因为JFrame似乎更关注交互界面,如菜单等,而“placeShip1”是从另一个类调用的。我只是觉得没有必要包括在内。:)更重要的是,你所说的控件
JFrame
(和
JPanel
,我建议您从这里开始)只是容器