繁体   English   中英

在JLabel中单击图像时获取鼠标的X和Y位置

[英]Getting the X and Y position of the mouse when it is clicked on the image in JLabel

我使用ImageIcon功能在JLabel中显示了一个图像。

JLabel包含在JPanel中。

单击图像时,我想获得相对于图像的鼠标位置。

我试图通过向包含图像的JLabel添加鼠标侦听器来解决此问题。

显然,即使我用图像的宽度和高度设置JLabel的大小,似乎JLabel会自动延伸到JPanel的大小。

因此,当下面的代码运行时,如果图像的大小小于JPanel,则获取X和Y位置将返回不需要的值。

有没有办法可以专门限制JLabel的大小,以便获得鼠标的X位置和Y位置可以正常工作?

或者更好的方法来获得相对于图像的鼠标位置? (哪个更好)

    ImageIcon icon = new ImageIcon(image);

    JLabel imageLabel = new JLabel(icon);
    imageLabel.setSize(image.getWidth(null), image.getHeight(null));

    imageLabel.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
            JOptionPane.showMessageDialog(imageLabel, e.getX()+" "+e.getY());
        }
    });

    imageLabel.validate();
    panel.add(imageLabel);
    panel.validate();

这完全是关于布局。

有关上图,请参阅此示例


看起来这个用例需要GridBagLayoutBoxLayout

您可能会看到问题,因为布局管理器正在控制标签的大小,而不是setSize()调用。

我可能会创建一个JPanel派生类(而不是JLabel),它通过绘制图像来实现paintComponent。 然后我重写JPanel的getPreferredSize()和getMaximumSize()以返回图像的尺寸。

使用标签会导致麻烦,因为会有填充,偏移等。

it seems that JLabel automatically stretches out to the size of JPanel.

问题在这里

imageLabel.setSize(image.getWidth(null), image.getHeight(null));

如果只有一个JLabel ,那么

myPanel.setLayout(new BorderLayout());//JPanel has by default FlowLayout
myPanel.add(myLabel, BorderLayout.CENTER)

如果有更多的JLabel与Image / IconImage,应该更好地寻找GridLayout

编辑

在所有情况下(对于reall图片)在任何事情之前

1)你必须确定图片比例3:2,4:3 16:10 ......,确定CropRatio然后你必须:

  • JLabel的setPreferredSize(new Dimension(x / cropRatio,y / cropRatio))

  • 通过使用paintComponent g2d.fillRect(0,0,x / cropRatio,y / cropRatio);

2)将JLabel放到JScrollPane ,但随后将保留原始的像素数

您可能会看到问题,因为布局管理器正在控制标签的大小,而不是setSize()调用。

我可能会创建一个JPanel派生类(而不是JLabel),它通过绘制图像来实现paintComponent。 然后我重写JPanel的getPreferredSize()和getMaximumSize()以返回图像的尺寸。

使用标签会导致麻烦,因为会有填充等。

但最终,导致我们的标签扩展的是布局管理器。 最简单的方法就是通过选择一个布局管理器来确保布局管理器不扩展标签,这样就可以确保布局管理器不会扩展标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM