我正在尝试使顶部角落的框能够在整个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) { }
}
我不知道我在哪里犯了错误。
是的,这就是调试的目的。您在代码中的哪个位置添加了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
的部分提供了可在任何组件上使用的基本拖动类。