首页 > Java > java教程 > 正文

MousePressed 方法是否会禁止在 JLabel 拖放中触发 MouseReleased?

Mary-Kate Olsen
发布: 2024-10-24 02:41:29
原创
847 人浏览过

Does MousePressed Method Inhibit MouseReleased from Triggering in JLabel Drag and Drop?

用于拖放的 JLabel 鼠标事件

问题:

通过鼠标事件覆盖实现 JLabel 的拖放,当在 mousePressed 事件中定义时, mouseReleased 事件无法在鼠标释放时触发。我做错了什么吗?”

代码:

<code class="java">Thumbnails[I_Loop].addMouseListener( new MouseAdapter() {
    public void  mouseReleased(MouseEvent me) {
           System.out.println("here mouse released");
      }
    public void mousePressed(MouseEvent me) {
        System.out.println("here mouse pressed");
        JComponent comp = (JComponent) me.getSource();
        TransferHandler handler = comp.getTransferHandler();
        handler.exportAsDrag(comp, me, TransferHandler.COPY);
    });</code>
登录后复制

答案:

而@Thomas的解决方案是正确的,这里有两种可供考虑的替代方法:

1. 使用 JLayeredPane:

此示例演示了使用 JLayeredPane 拖动组件。 ,而最近的示例使用类似的方法。

代码:

<code class="java">// ...
private Point mousePt;
private Point dragPt;
private Rectangle bounds;

public MouseDragTest() {
    this.addMouseMotionListener(new MouseMotionAdapter() {

        @Override
        public void mouseDragged(MouseEvent e) {
            int dx = e.getX() - mousePt.x;
            int dy = e.getY() - mousePt.y;
            dragPt.setLocation(dragPt.x + dx, dragPt.y + dy);
            super.mouseDragged(e);
        }
    });
    this.addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            bounds = getBounds();
            Point p = SwingUtilities.convertPoint(this, e.getPoint(), Bounds.Parent);
            if (bounds.contains(p)) {
                dragPt = p;
                mousePt = e.getPoint();
            }
        }
    });
    // ...
}</code>
登录后复制

2. 使用 MouseMotionListener:

此代码演示了如何使用 MouseMotionListener。这个更复杂的示例使用相同的原理。

代码:

<code class="java">// ...
private Point offset;

public MouseDragTest() {
    this.addMouseMotionListener(new MouseMotionAdapter() {

        @Override
        public void mouseDragged(MouseEvent e) {
            Point delta = e.getPoint();
            Point pt = new Point(getLocation().x + delta.x - offset.x,
                    getLocation().y + delta.y - offset.y);
            setLocation(pt);
        }
    });
    this.addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            offset = e.getPoint();
        }
    });
    // ...
}</code>
登录后复制

以上是MousePressed 方法是否会禁止在 JLabel 拖放中触发 MouseReleased?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板