2011-02-04 180 views
2

蓝色标签是为了移动,当你点击并拖动它。这有效,但x/y位置然后以有趣的方式跳跃。java jlabel点击/拖拽

下面的代码:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class test extends JFrame implements MouseListener, MouseMotionListener { 

private JPanel panel = new JPanel(null);  
private JLabel label1 = new JLabel(); 
private JLabel label2 = new JLabel(); 
private int mouseX = 200; 
private int mouseY = 100; 
private boolean drag = false; 

public test() { 
    this.add(panel); 
    panel.setBackground(Color.WHITE); 

    panel.add(label1); 
    label1.setOpaque(true); 
    label1.setBackground(Color.BLUE); 
    label1.setBounds(mouseX, mouseY, 100, 50); 
    label1.addMouseMotionListener(this); 
    label1.addMouseListener(this); 

    panel.add(label2); 
    label2.setOpaque(true); 
    label2.setBackground(Color.RED); 
    label2.setBounds(mouseX + 200, mouseY, 100, 50); 
    label2.addMouseMotionListener(this); 
    label2.addMouseListener(this); 
} 

@Override 
public void mousePressed(MouseEvent e) { 
    if (e.getSource() == label1) { 
     drag = true; 
    } 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    drag = false; 
} 

@Override 
public void mouseDragged(MouseEvent e) { 
    if (drag == true) { 
     mouseX = e.getX(); 
     mouseY = e.getY(); 
     label1.setBounds(mouseX, mouseY, 100, 50); 
    } 
} 

public void mouseMoved(MouseEvent e) {} 
public void mouseEntered(MouseEvent e) {} 
public void mouseExited(MouseEvent e) {} 
public void mouseClicked(MouseEvent e) {} 

public static void main(String[] args) { 
    test frame = new test(); 
    frame.setVisible(true); 
    frame.setSize(600, 400); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
} 
+0

[拖着一个JLabel在屏幕上](HTTP的可能重复://计算器.com/questions/4893265/dragling-a-jlabel-around-the-screen) – 2011-02-04 03:54:39

回答

1

坐标方MouseEvent ::的getX()和的MouseEvent ::的getY()返回表示事件相对于事件的主题(即位置相对于标签本身),这就解释了为什么你的解决方案导致标签不正常跳跃。

通过使用MouseEvent :: getComponent()获取标签,然后查询其位置(可能相对于拖动开始时的位置),您可以设计一个工作解决方案。

+0

我明白你的意思,当你说出相对位置等时,但由于某种原因,我无法让代码工作。当我试图创建这个:Component component = mouseEvent.getComponent();然后调用component.getX();它不起作用 – jjj 2011-02-04 05:06:56

1

你的问题是你根据鼠标位置在MouseListener中设置你的界限,但是MouseListener的位置相对于JLabel本身,但是JLabel的位置应该相对于面板设置。你需要做一些简单的矢量添加来解决这个问题。

编辑:哎呀,我没有看到这已经回答,他们说同样的事情......对不起。

2

只是把这个在您的MouseDragged方法:

public void mouseDragged(MouseEvent e) 
{ 
    if (drag == true) 
    { 
     JComponent jc = (JComponent)e.getSource(); 
     jc.setLocation(jc.getX()+e.getX(), jc.getY()+e.getY()); 
    } 
} 
1

也许尝试添加类似的东西 红色的人会做的更好

private int clicX = 0; 
private int clicY = 0; 

public void mousePressed(MouseEvent e) { 
drag = true; 
if (e.getSource() == label1) { 
} 
if (e.getSource() == label2) { 
    clicX = e.getX(); 
    clicY = e.getY(); 
} 
} 

public void mouseDragged(MouseEvent e) { 

     if (e.getSource() == label2) { 

     JComponent jc = (JComponent)e.getSource(); 
     jc.setLocation(jc.getX()+e.getX()-clicX, jc.getY()+e.getY()-clicY); 
     } 
0

创建两个全局变量:

int x_pressed = 0; 
int y_pressed = 0; 

再创建两个事件(和的mousePressed以上的mouseDragged的JLabel):

lbl_banner.addMouseListener(new MouseAdapter() 
{ 
    @Override 
    public void mousePressed(MouseEvent e) { 
     //catching the current values for x,y coordinates on screen 
     x_pressed = e.getX(); 
     y_pressed = e.getY(); 
    } 
}); 

lbl_banner.addMouseMotionListener(new MouseMotionAdapter(){ 
    @Override 
    public void mouseDragged(MouseEvent e){ 
     //and when the Jlabel is dragged 
     setLocation(e.getXOnScreen() - x_pressed, e.getYOnScreen() - y_pressed); 
    } 
});