java jlabel нажмите / перетащите - PullRequest
       10

java jlabel нажмите / перетащите

2 голосов
/ 04 февраля 2011

Синяя метка предназначена для перемещения при нажатии и перетаскивании. Это работает, но позиция x / y затем прыгает забавным образом.

Вот код:

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

Ответы [ 5 ]

2 голосов
/ 31 мая 2011

Просто поместите это на ваш 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 голос
/ 08 ноября 2011

Может быть, попробуйте добавить что-то подобное Красный сделает это лучше

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);
        }
1 голос
/ 04 февраля 2011

Ваша проблема заключается в том, что вы устанавливаете свои границы на основе местоположения мыши в MouseListener, но MouseListener имеет свое местоположение относительно самого JLabel, но местоположение JLabel должно быть установлено относительно панели.Вам нужно сделать простое векторное сложение, чтобы понять это.

edit: упс, я не видел, что на этот вопрос уже ответили, и они говорят то же самое ... извините.

1 голос
/ 04 февраля 2011

Координаты, возвращаемые MouseEvent :: getX () и MouseEvent :: getY (), представляют местоположение события относительно предмета события (т.е. относительно самой метки), что объясняет, почему ваше решение приводит к ошибочной метке прыжки.

Используя MouseEvent :: getComponent () для захвата метки, а затем запрашивая ее положение (возможно, относительно позиции при начале перетаскивания), вы можете разработать рабочее решение.

0 голосов
/ 08 мая 2014

Создайте две глобальные переменные:

int x_pressed = 0;
int y_pressed = 0;

, затем создайте два события (mousePressed и mouseDragged over 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);
    }
});
...