Java 如何在JFrame中的其他内容下方添加鼠标侦听器?

Java 如何在JFrame中的其他内容下方添加鼠标侦听器?,java,jframe,jpanel,mouselistener,Java,Jframe,Jpanel,Mouselistener,如果我的问题听起来很愚蠢,很抱歉,我对java还是新手。我将向您展示以下代码: public class Window extends JFrame{ private static final long serialVersionUID = -2139430787087799923L; private TransparentJPanel mousepanel; public Window(int width, int height, String title, G

如果我的问题听起来很愚蠢,很抱歉,我对java还是新手。我将向您展示以下代码:

public class Window extends JFrame{


    private static final long serialVersionUID = -2139430787087799923L;

    private TransparentJPanel mousepanel;

    public Window(int width, int height, String title, Game game) {
        super(title);   
        HandlerClass handler = new HandlerClass();
        mousepanel = new TransparentJPanel();
        mousepanel.addMouseListener(handler);

        setPreferredSize(new Dimension(width,height));
        setMaximumSize(new Dimension(width,height));
        setMinimumSize(new Dimension(width,height));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);

        setVisible(true);
        add(game);      <-- here I add the game
        add(mousepanel);    <-- here I add the panel with the mouselistener
        game.start();
    }
}
当我先添加游戏时,游戏显示,鼠标侦听器不工作,但当我先添加jpanel时,游戏不显示,但鼠标侦听器工作。 这是我的HandlerClass课程:

private class HandlerClass implements MouseListener {
    public void mouseClicked(MouseEvent event) {
        System.out.println(String.format("Clicked at %d,%d", event.getX(), event.getY()));
    }

    public void mouseEntered(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        System.out.println("Mouse Entered frame at X: " + x + " - Y: " + y);

    }
    public void mouseExited(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        System.out.println("Mouse Exited frame at X: " + x + " - Y: " + y);

    }
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        System.out.println("Mouse Pressed frame at X: " + x + " - Y: " + y);

    }

    public void mouseReleased(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        System.out.println("Mouse Released at X: " + x + " - Y: " + y);

    }

}
这就是我的问题。
请帮忙。

解决方案原来很简单

您可以向游戏对象添加鼠标侦听器,而不是为鼠标侦听器创建面板,如下所示

public Window(int width, int title, String title, Game game) {
    super(title);
    HandlerClass handler = new HandlerClass();

    setPreferredSize(new Dimension(width,height));
    setMaximumSize(new Dimension(width,height));
    setMinimumSize(new Dimension(width,height));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);

    setVisible(true);
    add(game, BorderLayout.CENTER);
    game.addMouseListener(handler);     
    game.start();
}

希望这有帮助

解决方案原来很简单

您可以向游戏对象添加鼠标侦听器,而不是为鼠标侦听器创建面板,如下所示

public Window(int width, int title, String title, Game game) {
    super(title);
    HandlerClass handler = new HandlerClass();

    setPreferredSize(new Dimension(width,height));
    setMaximumSize(new Dimension(width,height));
    setMinimumSize(new Dimension(width,height));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);

    setVisible(true);
    add(game, BorderLayout.CENTER);
    game.addMouseListener(handler);     
    game.start();
}

希望这有帮助

Game
是JPanel类吗?不是。Game是一个可运行的类,带有游戏循环等。下面是Game的完整代码。java:
JFrame
默认使用
BorderLayout
,它一次只允许在5个可用位置之一显示单个组件。有什么理由需要分开面板吗?让游戏面板充当
MouseListener
不是更符合逻辑吗?
game
是JPanel类吗?不是。game是一个可运行的类,带有游戏循环等。下面是game的完整代码。java:
JFrame
默认使用
边框布局,一次仅允许在5个可用位置之一显示单个组件。有什么理由需要分开面板吗?让游戏面板充当
鼠标听筒
,不是更符合逻辑吗?谢谢你的回答,但它仍然不起作用。当我启动它时,只有一个灰色的屏幕显示出来,但鼠标听筒可以工作。当我切换它们时,游戏显示出来,但鼠标听筒在开始时只工作了一秒钟,因为我在控制台中看到鼠标进入了画面。在这种情况下,我建议将游戏画布包装在JPanel中,并将两个面板(游戏面板和鼠标面板)添加到画面中。你说的包装是什么意思?你能解释一下吗?我的意思是创建一个扩展JPanel的新类,并将游戏画布添加到构造函数中。无论如何,这似乎不是问题,您提到会出现灰色屏幕,那么将TransparentJPanel的背景设置为transparent(alpha 0)如何?尝试将JTTransparentPanel中的
设置不透明(假)
替换为
设置背景(新颜色(0,0,0,0))
;你的意思是:
private-class-GamePanel扩展了JPanel{public-GamePanel(){Game-Game=new-Game();this.add(Game);}
panel.add(mousepanel);//请注意,您在开头添加的元素是最后一个要绘制的元素(在顶部)GamePanel gpanel=new GamePanel();添加面板(gpanel);添加(面板、边框布局、中心);game.start()因为当我启动时,我的电脑会打开很多窗口谢谢你的回答,但它仍然无法工作。当我启动它时,只有一个灰色的屏幕显示出来,但鼠标听筒可以工作。当我切换它们时,游戏显示出来,但鼠标听筒在开始时只工作了一秒钟,因为我在控制台中看到鼠标进入了画面。在这种情况下,我建议将游戏画布包装在JPanel中,并将两个面板(游戏面板和鼠标面板)添加到画面中。你说的包装是什么意思?你能解释一下吗?我的意思是创建一个扩展JPanel的新类,并将游戏画布添加到构造函数中。无论如何,这似乎不是问题,您提到会出现灰色屏幕,那么将TransparentJPanel的背景设置为transparent(alpha 0)如何?尝试将JTTransparentPanel中的
设置不透明(假)
替换为
设置背景(新颜色(0,0,0,0))
;你的意思是:
private-class-GamePanel扩展了JPanel{public-GamePanel(){Game-Game=new-Game();this.add(Game);}
panel.add(mousepanel);//请注意,您在开头添加的元素是最后一个要绘制的元素(在顶部)GamePanel gpanel=new GamePanel();添加面板(gpanel);添加(面板、边框布局、中心);game.start()因为当我启动时,我的计算机会打开很多窗口