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

时间:2011-09-22 05:43:05

标签: java swing jlabel imageicon null-layout-manager

我使用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();

4 个答案:

答案 0 :(得分:2)

一切都与布局有关。

有关上图,请参阅this example


这个用例似乎需要GridBagLayoutBoxLayout

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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(新维度(x / cropRatio,y / cropRatio))

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

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

答案 3 :(得分:0)

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

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

使用标签会导致麻烦,因为会出现填充等问题。

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