Java 在游戏中显示图片和使用int有问题

Java 在游戏中显示图片和使用int有问题,java,Java,我正在学习如何编程,我了解我正在做的大部分事情,但我最近陷入困境,无法解决这个问题。首先,我想在JFrame上显示一张图片,然后我想看看我的程序是否检测到鼠标移动,我只需在frameupdater中打印当前的x和y坐标即可: 核心类: package B0ss; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.MouseInfo; import java.awt.RenderingHints; impo

我正在学习如何编程,我了解我正在做的大部分事情,但我最近陷入困境,无法解决这个问题。首先,我想在JFrame上显示一张图片,然后我想看看我的程序是否检测到鼠标移动,我只需在frameupdater中打印当前的x和y坐标即可:

核心类:

package B0ss;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MouseInfo;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class B0ssCore extends JPanel implements KeyListener, MouseListener {

    //Subclasses
    MainMenu mainMenu = new MainMenu();

    public void updateMainMenu() throws InterruptedException {
        while (true) {
            repaint();
            mainMenu.drawMainMenu(getWidth(), getHeight());

            System.out.println(mouse_X, mouse_Y);

            Thread.sleep(20);
        }
    }   

    //Keyboard
    public void keyPressed( KeyEvent e) { }
    public void keyReleased ( KeyEvent e) { }
    public void keyTyped ( KeyEvent e ) { }

    //Mouse
    public void mousePressed ( MouseEvent e ) {
        int mouse_Y = MouseInfo.getPointerInfo().getLocation().y;
        int mouse_X = MouseInfo.getPointerInfo().getLocation().x;
    }
    public void mouseReleased ( MouseEvent e ) { }
    public void mouseClicked ( MouseEvent e ) { }
    public void mouseEntered ( MouseEvent e ) { }
    public void mouseExited ( MouseEvent e ) { }

    //Paint
    @Override
    public void paint ( Graphics g ) {
        super.paint(g);

        Graphics2D g2D = (Graphics2D) g;
        g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        mainMenu.paint(g2D);
    }




    public static void main(String args[]) throws InterruptedException {
        JFrame frame = new JFrame("Ba0ssGame");

        B0ssCore gameCore = new B0ssCore();

        gameCore.setSize(frame.getWidth(), frame.getHeight());

        frame.add(gameCore);

        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        gameCore.updateMainMenu();
    }

}
我的主菜单的子类:

package B0ss;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;

public class MainMenu {

    public void drawMainMenu( int width, int height) {

    }

    public void paint ( Graphics2D g2D ) {
        Image smiley = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Shimolis\\Desktop");
        g2D.drawImage(smiley, 0, 0, 50, 50, 0, 0, smiley.getWidth(null), smiley.getHeight(null), null);

        g2D.fillRect(50, 50, 100, 100);

    }

}
并不是我想让你修改我的代码。我想了解为什么我的updateMainMenu()中的ints mouse_x和mouse_y出现错误。我还研究了不同的显示图片的方法,但这太令人困惑了,因为我不明白imageObserver是什么,我试过阅读它,但我就是不明白。所以我试着把它设为空,这是个问题吗

谢谢你的帮助


编辑:我犯了一个很严重的错误(我没有完成图片的路径),很抱歉这篇文章。我意识到了图片的问题,但是鼠标x和鼠标y的问题仍然存在。

您的代码中有几个问题。只要简单看一下您的代码,我就可以说您的
mouse\u x
mouse\u y
MouseEvent e
方法的本地对象,请在该方法之外声明它们,以便您可以在
updateMainMenu()
方法中使用它们

另一件事是您正在实现
侦听器
,而没有实际使用它们,您分配给
鼠标x
鼠标y
的值是屏幕坐标,与
JPanel
无关

构造函数
添加到
B0ssCore
类中,并添加您实现的
侦听器
,例如:

public B0ssCore(){
    super();
    addMouseListener(this);
}
public void mousePressed ( MouseEvent e ) {
    // don't forget to declare mouse_x and mouse_y at the class level
    mouse_Y = e.getX(); // relative to container coordinates
    mouse_X = e.getX();
}
并将
public void mousePressed(MouseEvent e)
更改为类似以下内容:

public B0ssCore(){
    super();
    addMouseListener(this);
}
public void mousePressed ( MouseEvent e ) {
    // don't forget to declare mouse_x and mouse_y at the class level
    mouse_Y = e.getX(); // relative to container coordinates
    mouse_X = e.getX();
}
代码中还有其他问题。例如:

while (true) {
    repaint();
    mainMenu.drawMainMenu(getWidth(), getHeight());
    System.out.println(mouse_X, mouse_Y);
    Thread.sleep(20);
}

看起来可疑。在你的代码中有很多事情可以做得更好,但我想这就是你学习好运的原因。

这对我帮助很大,谢谢!但我不应该在镜框里加上鼠标听筒吗?至少对于我的keyListener,因为我需要将我的程序焦点设置为框架,这与鼠标侦听器类似吗?你可以,但根据你的代码判断,你对输入的所有操作都是在
JPanel
中完成的,所以不,不要将
侦听器添加到
JFrame
中,只需调用
requestFocus()B0ssCore
构造函数中的code>来触发
KeyListener
。@Joseph MouseListener通常不像KeyListener那样挑剔,但你应该使用键绑定,而不是你应该按照程序员的建议去做。