Swing - 在 mouseReleased 下获取新组件 [英] Swing - Get new component under mouseReleased

查看:25
本文介绍了Swing - 在 mouseReleased 下获取新组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题可能掩盖了根本缺乏 Swing 知识,但我似乎无法确定我做错了什么.本质上,我想检测一个组件中的 mousePressed,然后在鼠标释放时接收鼠标下方的任何组件的 mouseReleased,而不是原始组件.

This question probably belies underlying lack of Swing knowledge, but I can't seem to pin down what I'm doing wrong. Essentially I want to detect mousePressed in one component, and then receive the mouseReleased for whatever component is under the mouse when it is released, rather than the original component.

import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
import net.miginfocom.swing.MigLayout;

public class TestMouseListener extends MouseInputAdapter {

    public void mouseEntered(MouseEvent arg0) {System.out.println("Entered " + arg0.getComponent());}
    public void mouseExited(MouseEvent arg0) {System.out.println("Exited " + arg0.getComponent());}
    public void mousePressed(MouseEvent arg0) {System.out.println("Pressed " + arg0.getComponent());}
    public void mouseReleased(MouseEvent arg0) {System.out.println("Released " + arg0.getComponent());}

    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setLayout(new MigLayout());
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TestPanel panel1 = new TestPanel("Panel 1");
        TestPanel panel2 = new TestPanel("Panel 2");
        panel1.add(new JLabel("Text1"));
        panel2.add(new JLabel("Text2"));
        frame.add(panel1);
        frame.add(panel2);
        TestMouseListener listener = new TestMouseListener();
        panel1.addMouseListener(listener);
        panel1.addMouseMotionListener(listener);
        panel2.addMouseListener(listener);
        panel2.addMouseMotionListener(listener);
        frame.setVisible(true);
    }
}
class TestPanel extends JPanel {
    String name;
    TestPanel(String name){ this.name = name; }
    public String toString(){ return name; }
}

因此,当我将鼠标悬停在面板 1 上时,单击并拖动到面板 2,然后松开,我得到以下信息:

So when I mouse over panel 1, click, drag to panel 2, release, I get the following:

Entered Panel 1
Pressed Panel 1
Exited Panel 1
Entered Panel 2
Released Panel 1

如何获取我发布的面板?我希望 mouseReleased 事件会为 Panel 2 触发,但显然它不会.

How do I get the panel I released over? I was hoping the mouseReleased event would fire for Panel 2 but obviously it does not.

推荐答案

存储一个变量,用于保存您最近输入的组件.每次触发 MouseEntered 事件时继续覆盖它.然后有一个方法,这样当你松开鼠标按钮时,你可以使用你最近输入的任何组件.

Store a variable that holds your most recently entered component. Keep overwriting it every time you trigger a MouseEntered event. Then have a method, so that when you release the mouse button, you can use whatever your most recently entered component is.

Component lastEntered;

private void MouseEntered(MouseEvent e) {
    lastEntered = e.getComponent;
}

这篇关于Swing - 在 mouseReleased 下获取新组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆