2011-09-22 90 views
1

我使用ImageIcon功能在JLabel内部显示了一个图像。在JLabel中的图像上单击时获取鼠标的X和Y位置

JLabel包含在JPanel中。

当图像被点击时,我想获取鼠标相对于图像的位置。

我想通过将鼠标监听器添加到包含 图像的JLabel来解决此问题。

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

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

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

或者更好的方式来获得相对于图像的鼠标位置?因为布局管理器控制您的标签,不是的setSize()调用的大小(它会更好)

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(); 

回答

1

你可能看到的问题。

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

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

+0

如果覆盖'paintComponent()',并且不需要添加更多组件,则'JComponent'提供的功能几乎与'JPanel'几乎一样。无论使用哪种方式,我仍然会选择使用正确布局的面板中的标签。 –

+0

(几乎重复的答案?)0)另一个ist中的最后一段死于点(layoutManager规则),因为它是第一个。中间的东西是..不太好:1)似乎没有任何需要扩展只是为了显示图标2)如果有需要 - f.i.使用面板的自然角色作为容器并显示背景图像 - 然后覆盖getPref/Max可以(也可能应该)完成,但是没有帮助(参见第0项)3)没有问题“填充和这样的“在一个带有图标的简单标签中,空文本和空白边框..没有野蛮的猜测,请:-) – kleopatra

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

EDI Ť

在所有情况下

(对于雷尔图片)之前的任何

1)必须确定画面比为3:2,4:3 16:10 ...,确定CropRatio那么你必须:

  • 了setPreferredSize(新尺寸(X/cropRatio,Y/cropRatio))JLabel的

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

2)把JLabel放在JScrollPane,但随后会举行像素

+0

如果myPanel只有1个组件,看起来该组件被拉长了:( – user482594

+0

@ user482594请参阅我的编辑 – mKorbel

0

你可能看到的问题,因为布局管理器控制您的标签的大小,而不是的setSize()调用的原始大写金额。

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

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

但是最终导致我们的标签扩展的是布局管理器。最喜欢最简单的方法就是确保布局管理器不扩展标签,方法是选择一个布局管理器,将组件保持为首选大小。

相关问题