需要帮助定位 java

Need help positioning in java

我创建了这个 java 程序,我想要一个输出,如果 int x 和 int y 大于 100,它将绘制一个矩形。但事实并非如此。我怎样才能让它工作?我需要添加另一行代码吗? 这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


@SuppressWarnings("serial")
public class GameSetup extends JPanel implements MouseMotionListener{

public static JFrame njf = new JFrame("Test");
public static int x, y;

public static void main(String[] args){

    GameSetup gs = new GameSetup();
    njf.add(gs);

}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    this.setBackground(Color.BLACK);
    g.setColor(Color.GREEN);
    g.fillRect(150, 75, 200, 100);
    g.setColor(Color.ORANGE);
    g.drawString("Play", 239, 123);
    njf.addMouseListener(new MouseAdapter() {
        public void mouseMoved(MouseEvent e) {
            x = e.getX();
            y = e.getY();

        }
    });
    if(x > 100 && y > 100){
        g.drawRect(10, 10, 100, 100);
    }
}

public GameSetup(){
    njf.setSize(500,500);
    njf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    njf.setResizable(false);
    njf.setLocationRelativeTo(null);
    njf.setVisible(true);
}

@Override
public void mouseDragged(MouseEvent arg0) {

}

@Override
public void mouseMoved(MouseEvent e) {

}
  }

好的,您上面包含的代码有几处错误。

首先让我印象深刻的是您将鼠标动作侦听器添加到框架的方式。这有很多问题。

首先,您在 paintComponent 方法中执行此操作,如果它有效,仍然被认为是不好的做法,因为 paintComponent 方法可能会被调用多次。正如评论所指出的那样,在面板的构造函数中执行此操作。

第二个是你将鼠标侦听器添加到框架,而不是面板,这不起作用,因为面板是 "above" 框架,所以鼠标事件只会在控制板。最好的办法是将 MouseMotionListener 直接添加到面板本身。

第三个是您在 GameSetup class 中实现了 MouseMotionListener 接口,但实际上从未对这个实现做任何事情。所以我所做的就是摆脱了内部 class,让面板成为它自己的 MouseMotionListnener

代码的第二个错误是 paintComponent 方法仅在某些时间点被调用(参见 this)。这意味着即使鼠标可能已在区域内移动,也不会调用您的 paintComponent 方法来相应地更新屏幕。为此,您需要为面板调用 repaint 方法。

第三个是你没有给你的panel设置size,默认是0x0,所以你需要给你的panel设置一个size(应该和frame本身一样)(如果你想保留默认布局)。

综上所述,这是我修复的您的代码。我添加了一个名为 enteredZone 的变量来跟踪鼠标之前是否进入过该区域,这样即使鼠标在进入该区域后离开该区域,该矩形也会保持不变(如果您想保留它,您可以选择).请注意,此代码还有其他一些可能被认为是不好的做法,但这足以让您入门:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


@SuppressWarnings("serial")
public class GameSetup extends JPanel implements MouseMotionListener {

    public static JFrame njf = new JFrame("Test");
    public static int x = 0, y = 0;
    public static boolean enteredZone = false;

    public static void main(String[] args) {
        GameSetup gs = new GameSetup();
        gs.addMouseMotionListener(gs);
        njf.add(gs);
        njf.setVisible(true);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        this.setBackground(Color.BLACK);

        g.setColor(Color.GREEN);
        g.fillRect(150, 75, 200, 100);
        g.setColor(Color.ORANGE);
        g.drawString("Play", 239, 123);


        if (x > 100 && y > 100 || enteredZone){
            g.drawRect(10, 10, 100, 100);
            enteredZone = true;
        }
    }

    public GameSetup() {
        super();
        setSize(500, 500);
        njf.setSize(500,500);
        njf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        njf.setResizable(false);
        njf.setLocationRelativeTo(null);
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        x = e.getX();
        y = e.getY();

        if (x > 100 && y > 100) repaint();
    }

}