这是怎么回事?无法设置我的 JLabel 的位置



所以我正在编写一个小游戏,当我尝试将 JLabel 设置为 x = 0 和 y = 0它出现在JFrame的中间。这是我添加时的代码

for (int i = 0; i < btns.size(); i++){
                    Button btn = btns.get(i);
                    if (!components.contains(btn.getJLabel())){
                        frame.add(btn.getJLabel());
                        components.add(btn.getJLabel());
                    }
                    if (!btn.getJLabel().isVisible()) btn.getJLabel().setVisible(true);
                    btn.getJLabel().setText(btn.getText());
                }

我还在其中放了一个鼠标侦听器,这样当鼠标越过按钮时它会变成红色,但是当我将鼠标悬停在 JFrame 上时它会变成红色

label.addMouseListener(new MouseListener(){
        @Override
        public void mouseClicked(MouseEvent e) {
            onClick();
        }
        @Override
        public void mouseEntered(MouseEvent e) {
            Hover();
        }
        @Override
        public void mouseExited(MouseEvent e) {
            out();
        }
        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub
        }});
}
public void Hover(){
    label.setForeground(Color.RED);
}
public void out(){
    label.setForeground(Color.BLACK);
}

以下是主类的完整代码: ` 公共静态JFrame框架;

public static double VERSION = 1.0;
public static int WIDTH = 800, HEIGHT = 700;
public static boolean editorMode = false;
public static boolean selectedTower = false;
public static boolean running = false;
public static boolean mouseOver = false;
public static Tower editorTower = null;
public static Tower selectTower = null;
public static ArrayList<Button> btns;
public static ArrayList<Tower> towers;
public static ArrayList<Component> components;
public static void main(String[] args) {
    frame = new JFrame();
    frame.setTitle("MyLittleGame v"+VERSION);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WIDTH, HEIGHT);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.addMouseListener(new MouseListener(){
        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mouseEntered(MouseEvent arg0) {
            mouseOver = true;
        }
        @Override
        public void mouseExited(MouseEvent arg0) {
            mouseOver = false;
        }
        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }});
    btns = new ArrayList<Button>();
    towers = new ArrayList<Tower>();
    components = new ArrayList<Component>();
    registerBtns();
    running = true;
    startGameLoop();
}
public static void registerBtns(){
    btns.add(new NewTowerBtn());
}
private static void startGameLoop(){
    new Thread(new Runnable(){
        @Override
        public void run() {
            int towerAdding = 0;
            while (running){
                int mouseX = 10;
                int mouseY = 10;
                if (mouseOver){
                    mouseX = (int) frame.getMousePosition().getX();
                    mouseY = (int) frame.getMousePosition().getY();
                }
                if (editorMode && editorTower != null){
                    editorTower.setXloc(mouseX);
                    editorTower.setYloc(mouseY);
                }
                for (int i = 0; i < towers.size(); i++){
                    Tower tower = towers.get(i);
                    if (!components.contains(tower.getLabel())){
                        frame.add(tower.getLabel());
                        components.add(tower.getLabel());
                    }
                    if (towerAdding >= 100) tower.grow();
                    if (!tower.getLabel().isVisible()) tower.getLabel().setVisible(true);
                    tower.getLabel().setText(tower.getWholeString());
                }
                for (int i = 0; i < btns.size(); i++){
                    Button btn = btns.get(i);
                    if (!components.contains(btn.getJLabel())){
                        frame.add(btn.getJLabel());
                        components.add(btn.getJLabel());
                    }
                    if (!btn.getJLabel().isVisible()) btn.getJLabel().setVisible(true);
                    btn.getJLabel().setText(btn.getText());
                }
                if (towerAdding >= 100) towerAdding = 0;
                towerAdding++;
                System.out.println("Went through");
            }
        }}).start();
}`

另外,当我试图添加一个位置为 x = 0 和 y = 0 的普通 JLabel 时,它也把它放在中间?谢谢。

正如 arcy 所说,如果你尝试使用绝对定位,你必须将框架的布局更改为 null

frame.setLayout(null);

您还可以在此处查看如何使用其他布局管理器。

最新更新