【发布时间】:2014-10-15 05:43:34
【问题描述】:
每当我拖动鼠标时,我都需要相应地移动 JLabel。
为什么它在拖动时显示多个 JLabel 而没有在适当的位置显示组件?
public class Mover extends JFrame
{
private JPanel jPanel;
private JLabel jLabel1;
private JLabel jLabel2;
private int myXX = 0;
private int myYY = 0;
public Mover() {
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jPanel = new JPanel(null);
jLabel1 = new JLabel("label one");
jLabel2 = new JLabel("label two");
jLabel1.setBounds(100, 100, 100, 100);
jLabel2.setBounds(100, 100, 100, 100);
jLabel1.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
System.out.println("Label One");
myXX = e.getX() - (jLabel1.getWidth() / 2);
myYY = e.getY() - (jLabel1.getHeight() / 2);
jLabel1.setLocation(myXX, myYY);
repaint();
}
});
jLabel2.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
System.out.println("Label Two");
myXX = e.getX() - (jLabel2.getWidth() / 2);
myYY = e.getY() - (jLabel2.getHeight() / 2);
jLabel2.setLocation(myXX, myYY);
repaint();
}
});
jPanel.add(jLabel1);
jPanel.add(jLabel2);
add(jPanel);
repaint();
revalidate();
setVisible(true);
}
public static void main(String args[]) {
new Mover();
}
}
这个问题有什么完美的解决方案吗?
显然提前谢谢。
【问题讨论】:
-
MouseEvent是基于生成它的本地组件上下文,即 x/y 位置相对于标签的 x/y 位置 -
没有布局管理器时调用
revalidate没有意义,没有什么需要重新验证... -
哦,但是我们可以根据鼠标移动来移动标签的位置吗?
-
是的,您需要将源点转换为它的父上下文...查看示例答案...