Я пытаюсь добавить JLabel в JComponent (который уже находится на JPanel), а затем сделать так, чтобы я мог щелкнуть и перетащить JLabel, чтобы переместить его в другое место.
На данный момент JLabel действительно появляется, но когда я щелкаю и перетаскиваю его, он перемещает весь JComponent, а не только JLabel сам по себе.
Вот пример кода:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.io.*;
public class Test extends JComponent implements ActionListener {
int dragX, dragY;
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.drawRect(0, 0, 300, 300);
MouseListener ml = new MouseListener() {
public void mousePressed(MouseEvent e) {
dragX = e.getX();
dragY = e.getY();
}
};
MouseMotionAdapter mma = new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e){
setLocation(e.getX() - dragX + getLocation().x,
e.getY() - dragY + getLocation().y);
}
};
BufferedImage image;
try {
image = ImageIO.read(new File("image.png"));
ImageIcon i = new ImageIcon(image);
JLabel label = new JLabel(i);
label.setBounds(30, 30, 60, 19);
label.addMouseListener(ml);
label.addMouseMotionListener(mma);
add(label);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(900, 650);
frame.setVisible(true);
frame.setResizable(false);
Test t = new Test();
frame.getContentPane().add(t);
}
}
Я чувствую, что это как-то связано со строкой setLocation()
в блоке MouseMotionAdapter()
, но я не совсем уверен.
Заранее спасибо!
paintComponent
, это только вызовет проблемы - person MadProgrammer   schedule 23.02.2016DragListener
, содержащийся в Пример переноса Windows. Это в основном код, который у вас есть сейчас, за исключением того, что логика находится в отдельном классе. Я, конечно, не рекомендовал бы ответ, предложенный как дубликат. - person camickr   schedule 23.02.2016