2015-03-21 5 views
0

У меня есть JPanel в GridLayout, к которому я добавляю кнопки. Я хочу реализовать какой-то эффект на кнопках, когда вводится мышь, и когда мышь выйдет из кнопки. Событие mouseEntered корректно запускается, когда мышь наводится над кнопкой, однако, когда мышь покидает кнопку, событие mouseExited не запускается. Как я могу исправить эту проблему?MouseExited не запускается при нажатии кнопки мыши

Пользовательские JButton

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 


public class CustomButton extends JButton implements MouseListener{ 


    Dimension scaled; 

    public CustomButton(String text){ 
     super(text); 

     setContentAreaFilled(false); 
     setBorderPainted(false); 
     addMouseListener(this); 

    } 
    @Override 
    public void invalidate() { 
     super.invalidate(); 
     scaled = getSize(); 

    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     g.drawRoundRect(0, 0, getWidth()-1, getHeight()-1, 20, 20); 
     g.fillRoundRect(0, 0, getWidth()-1, getHeight()-1, 20, 20);    

    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println("entered the view"); 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

     System.out.println("exited the view"); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 


} 
+0

* "некоторые вид эффекта "* Какой эффект? –

ответ

2

Не используйте MouseListener, а добавить ChangeListener к модели JButton и реагировать на изменения в его опрокидывание состоянии, ... isRollover()

import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class TestRollover extends JPanel { 
    private static final int PREF_W = 500; 
    private static final int PREF_H = PREF_W; 
    JButton button = new JButton("Button"); 

    public TestRollover() { 
     add(button); 
     button.getModel().addChangeListener(new ChangeListener() { 
     private boolean rollover = false; 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      ButtonModel model = (ButtonModel) e.getSource(); 
      if (model.isRollover() != rollover) { 
       System.out.println("Rollover: " + model.isRollover()); 
       rollover = model.isRollover();    
      } 
     } 
     }); 

     button.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseEntered(MouseEvent e) { 
      System.out.println("mouse entered"); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      System.out.println("mouse exited"); 
     } 
     }); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     TestRollover mainPanel = new TestRollover(); 

     JFrame frame = new JFrame("TestRollover"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+1

Но почему не происходит событие mouseExited? – user2864740

+0

@ user2864740: он отлично работает для меня (см. Код выше). Если у вас все еще есть проблемы, вам нужно создать и опубликовать [минимальную примерную программу] (http://stackoverflow.com/help/mcve). –

+1

@ user2864740: проблема с вашим вопросом заключается в том, что вы не ** ** показываете ** нас, почему ваш код не работает. Если вы можете создать и опубликовать [mcve] (http://stackoverflow.com/help/mcve), тогда мы можем вам рассказать. В противном случае никто никогда не узнает. –

Смежные вопросы