1

我使用 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

4 回答 4

2

这都是关于布局的。

有关上图,请参见此示例


看起来这个用例需要一个GridBagLayoutor BoxLayout

于 2011-09-22T07:12:21.497 回答
1

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

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

使用标签会带来麻烦,因为会有填充、偏移等。

于 2011-09-22T05:51:29.077 回答
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)

如果有更多的带有 Image/IconImage 的 JLabel 并且应该更好地寻找 GridLayout

编辑

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

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,但随后将保持原始像素数量

于 2011-09-22T05:53:42.610 回答
0

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

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

使用标签会引起麻烦,因为会有填充等。

但最终,导致我们的标签扩展的是布局管理器。最喜欢做你想做的最简单的方法是确保你的布局管理器没有扩展标签,方法是选择一个布局管理器来保持组件的首选大小。

于 2011-09-22T06:02:34.060 回答