java - 将 JLabel 拖放到另一个 JLabel 的顶部
问题描述
我有两个图像作为 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);
}
}
}
解决方案
我有两个图像作为 JLabels 的 JPanel
在我看来,您有一个包含 2 个面板的面板。这些面板中的每一个都包含一个标签。为什么要将每个标签添加到第二个面板?
摆脱“包装”面板,只需将标签直接添加到主面板。
我正在尝试拖动右侧图像并将其放在左侧图像的顶部,释放鼠标后它应该保留在那里
Swing 基于Z Order
. 当一个组件被添加到面板时,ZOrder 会增加,并且首先绘制具有最高 ZOrder 的组件,所以基本上最后添加到面板的组件首先被绘制。
因此,在您的情况下,右标签涂在左标签之前。
如果要拖动右标签使其在左标签之后绘制,则在 mousePressed 代码中,您可以使用更改组件的 ZOrder
JPanel parent = e.getComponent().getParent;
parent.setComponentZOrder(e.getComponent(), 0);
现在,当您将组件拖到面板上时,组件将被最后绘制。
推荐阅读
- arrays - rxjs 在间隔中为数组中的每个项目调用 2 个服务
- c++ - 如何将函数分配给已定义的已声明函数
- system-verilog - 子模块是由求解器独立刺激还是通过连接的顶层模块刺激?
- batch-file - 批量混合特殊字符故障?
- html - * 是 CSS 中的合法选择器吗?如果是这样,为什么在将显示设置为阻止时会生成此输出?
- python - Python:从时间序列中删除前导和尾随零和相应的时间值
- javascript - 从 React Native组件获取图像源
- python - Python 代码未显示所需的输出但继续运行
- python - 在位置参数和关键字参数中压缩迭代
- java - Java:将多个独立脚本重构为一个脚本