2011-01-19 3 views
1

Я хочу иметь clickable значок (объект ImageIcon) внутри JLabel. Как я могу добавить MouseListener или любой ActionListener только к этому значку. Есть ли другой способ узнать, был ли нажат значок? Я использую метод setIcon() для JLabel для установки его значка.Как добавить слушателя мыши к ImageIcon, встроенному в JLabel?

Спасибо.

+1

Почему бы не «JButton» с «Значком»? – trashgod

+0

related: http://stackoverflow.com/questions/1281612/adding-a-child-component-to-a-jbutton – finnw

+0

Значок 'JButton' действительно отвечает на событие мыши, а' JLabel' doesn «т. –

ответ

2

У вас может быть две отдельные JLabel внутри контейнера, первая с текстом, вторая с только иконкой и добавление слушателя мыши к значку JLabel.

+1

Я надеялся, что это будет разумный способ сделать это с помощью положения X и Y события события мыши и увидеть, было ли это в пределах значка, но, увы, прямоугольник, который описывает положение значка в JLabel, является частным в LabelUI , поэтому даже подклассификация LabelUI не даст вам доступа к ней. Однако он вызывает SwingUtilities.layoutCompoundLabel(), одним из параметров которого является прямоугольник значка, поэтому вы можете, если хотите, подкласса SwingUtilities перехватить эту информацию и сохранить ее где-нибудь. Но на самом деле, я бы не стал беспокоиться. Просто используйте два компонента. –

-4

вы можете использовать этот код для решения вашей проблемы:

public class Test extends JFrame { 
    private JLabel label; 
    ImageIcon icon = new ImageIcon("example.gif"); 
    public Test(){ 
     label = new JLabel(icon); 
     label.addMouseListener(new MouseListener() { 

     public void mouseClicked(MouseEvent e) { 
     //for example  
      JOptionPane.showMessageDialog(null, "Hello"); 

     } 

     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseEntered(MouseEvent e) { 
     } 

     public void mouseExited(MouseEvent e) { 
     } 
    }); 
} 

}

+2

Это не помогает оригинальному плакату со своей проблемой. Он знает, как создавать и использовать MouseListener, а хочет слушать только часть изображения JLabel. –

1

Этот метод очень Hacky, но работал для меня.

JLabel.addMouseListener(new MouseAdapter(){ 
     public void mousePressed(MouseEvent me){ 
      try { 
       Robot robot = new Robot(); 
       if(JLabel.getBounds().contains(me.getPoint()) && !robot.getPixelColor(me.getXOnScreen(),me.getYOnScreen()).equals(page.getBackground())){ 
        //Do action here 
       } 
      } catch (AWTException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
Смежные вопросы