(JAVA-SWING)无法使用MouseListener拖动组件

问题描述 投票:0回答:1

我正在尝试使顶部角落的框能够在整个JFrame中移动。但是,我无法这样做。我在控制台内没有收到任何错误,这意味着我没有任何错误的提示。

我对Swing并不是最好的,因为我只使用了几个星期。有更多经验和知识的人可以帮忙吗?

编辑:我确实尝试使用System.out.println()调试此代码;确认mouseListener组件被正确调用。运气不好,因为没有任何内容输出到控制台,这意味着未正确调用或执行该组件。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class Main extends JFrame {
    JFrame frame = new JFrame();

    public Main() {
        JPanel back = new JPanel();
        back.setSize(getSize());
        back.setBackground(Color.white);
        back.setLayout(null);
        back.setLocation(0,0);

        for (int a = 0; a < 10; a++) {
            JPanel panel = new JPanel();
            panel.setBackground(new Color(a*10,a*5,a*5));
            panel.setSize(150, 100);
            panel.setName("Panel: " + (a + 1));
            frame.add(panel);
        }
        Movement movement = new Movement(back.getComponents());

        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(700,500);
        frame.setLocationRelativeTo(this);
        frame.setLayout(null);
        frame.add(back);
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        Main main = new Main();
    }
}

class Movement implements MouseListener, MouseMotionListener {
    private int x, y;

    public  Movement(Component... pns) {
        for (Component panel: pns) {
            panel.addMouseListener(this);
            panel.addMouseMotionListener(this);
        }
    }

    @Override
    public void mouseClicked(MouseEvent mouseEvent) { }
    @Override
    public void mousePressed(MouseEvent mouseEvent) {
        x = mouseEvent.getX();
        y = mouseEvent.getY();
    }
    @Override
    public void mouseReleased(MouseEvent mouseEvent) { }
    @Override
    public void mouseEntered(MouseEvent mouseEvent) { }
    @Override
    public void mouseExited(MouseEvent mouseEvent) { }
    @Override
    public void mouseDragged(MouseEvent mouseEvent) {
        mouseEvent.getComponent().setLocation((mouseEvent.getX() + mouseEvent.getComponent().getX()) - x, (mouseEvent.getY() + mouseEvent.getComponent().getY()) - y);
    }
    @Override
    public void mouseMoved(MouseEvent mouseEvent) { }
}
java swing user-interface mouselistener
1个回答
0
投票

我不知道我在哪里犯了错误。

是的,这就是调试的目的。您在代码中的哪个位置添加了System.out.println(…)语句,以查看代码是否正在执行预期的工作方式?您是否验证了侦听器代码已执行?您是否确定位置计算正确?

back.setSize(getSize());

不要以为该陈述会达到您的期望。在实际使该框可见之前,该框将没有尺寸。

frame.setLayout(null);

不需要该声明。只需保留默认的BorderLayout。然后,当您将“后”面板添加到框架时,该面板将填充框架中的可用空间。

    frame.add(panel);
}
Movement movement = new Movement(back.getComponents());

由于您从未向“后”面板添加任何组件,因此上述代码不会做很多事情。因此,您永远不会将侦听器添加到任何组件。

我认为您想要:

//frame.add(panel);
back.add(panel);

没有尝试验证您的拖动逻辑是否正确,但是您也可以签出Moving Windows Basic Dragging的部分提供了可在任何组件上使用的基本拖动类。

© www.soinside.com 2019 - 2024. All rights reserved.