【发布时间】:2018-06-29 13:37:46
【问题描述】:
我有两个图像作为 JLabels 的 JPanel。我正在尝试将右侧图像拖放到左侧图像的顶部,释放鼠标后它应该保留在那里。目前我可以拖动图像,但它位于放置位置图像下方。第二个问题是当我在图像上按下鼠标时,该位置与实际图像边界不同。如何获得相对于主面板的确切位置?
这是我的代码。
public class loadLayout extends JPanel{
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
public loadLayout(){
setLayout(new GridLayout(0, 2));
setPreferredSize(new Dimension(600, 400));
setMaximumSize(new Dimension(600, 400));
setMinimumSize(new Dimension(600, 400));
try {
BufferedImage img = ImageIO.read(new File("test.jpg"));
JPanel leftP = new JPanel(null);
JLabel leftL = new JLabel(new ImageIcon(img));
leftL.setSize(img.getWidth(), img.getHeight());
leftL.setLocation(10, 10);
leftP.add(leftL);
JPanel rightP = new JPanel();
BufferedImage img2 = ImageIO.read(new File("dragger.png"));
JLabel rightL = new JLabel(new ImageIcon(img2));
rightL.setSize(img2.getWidth(), img2.getHeight());
rightP.add(rightL);
add(leftP);
add(rightP);
MouseAdapter mouseHandler = new MouseAdapter() {
private Point delta;
@Override
public void mousePressed(MouseEvent e) {
imagePoint = SwingUtilities.convertPoint(rightL, rightL.getX(), rightL.getY(), loadLayout.this);
Point origin = e.getPoint();
Rectangle bounds = new Rectangle(imagePoint, new Dimension(rightL.getWidth(), rightL.getHeight()));
if (bounds.contains(origin)) {
delta = new Point(origin.x - imagePoint.x, origin.y - imagePoint.y);
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (delta != null) {
imagePoint = e.getPoint();
imagePoint.translate(-delta.x, -delta.y);
rightL.setLocation(imagePoint);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(delta != null){
rightL.setLocation(delta);
revalidate();
repaint();
}
delta = null;
}
};
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);
} catch (IOException ex) {
Logger.getLogger(DragnDropTest1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
【问题讨论】:
-
我的问题是当我点击图片时,它的位置与实际位置不同。我想得到确切的位置。
-
好东西!现在这使我的 cmets 噪音(已删除)和密切投票无关(撤回)。一切顺利。 :)
标签: java swing drag-and-drop jpanel jlabel