2011-02-04 60 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のが重複する可能性:// stackoverflowの.com/questions/4893265/dragging-a-jlabel-around-the-screen) –

答えて

1

のMouseEventによって返される座標のgetX()とのMouseEvent ::のgetY()ラベル自体に対して、すなわち(イベントの対象にイベントの位置を表します)、なぜあなたのソリューションは、ラベルが不規則にジャンプする結果になるかを説明します。

MouseEvent :: getComponent()を使用してラベルを取得し、その位置を(ドラッグが開始されたときの位置を基準として)照会することで、実際の解決策を考案できます。

+0

私は、あなたが相対位置などを話すときの意味を理解していますが、何らかの理由でコードを取得できません。私はこれを作成しようとした:Component component = mouseEvent.getComponent(); component.getX()を呼び出します。それは動作しませんでした – jjj

+0

これを解決することができますJLabel、それを保持するJPanelとラベルをクリックすると、マウスの画面の位置に従ってドラッグされ、それに応じてJLabelを移動するJPanel /コンテナへ)。基本的なベクターの追加だけです。 –

1

MouseListenerのマウスの位置に基づいて境界を設定するのが問題ですが、MouseListenerの位置はJLabel自体の相対位置になりますが、JLabelの位置はパネルを基準に設定する必要があります。これを理解するには、単純なベクターの追加が必要です。

編集:おっと、私はこれがすでに答えられているとは思わなかったし、同じことを言う...ごめんなさい。

2

ちょうどあなたのMouseDragged方法でこれを置く:赤1が行います

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

2つのグローバル変数を作成します。

int x_pressed = 0; 
int y_pressed = 0; 

を、次に作成する二つの事象(JLabelのオーバーのmousePressedとmouseDragged):

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); 
    } 
});