2011-09-22 91 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()返回圖像的尺寸。

使用標籤會導致麻煩,因爲會出現填充等現象。

但是最終導致我們的標籤擴展的是佈局管理器。最喜歡最簡單的方法就是確保佈局管理器不擴展標籤,方法是選擇一個佈局管理器,將組件保持爲首選大小。

相關問題