gpt4 book ai didi

java - 需要帮助在 java 中定位

转载 作者:行者123 更新时间:2023-11-29 04:37:17 25 4
gpt4 key购买 nike

我创建了这个 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) {

}
}

最佳答案

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

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

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

第二个是您将鼠标监听器添加到框架,而不是面板,这不起作用,因为面板在框架“上方”,所以鼠标事件只会在面板内被识别。此处最好的选择是将 MouseMotionListener 直接添加到面板本身。

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

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

第三个是你没有为你的面板设置大小,默认的是0x0,所以你需要设置你的面板大小(应该和框架本身一样)(如果你想以保持默认布局)。

综上所述,这是我修复的代码。我添加了一个名为 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();
}

}

关于java - 需要帮助在 java 中定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40798817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com