2015-09-07 53 views
1

我正在测试ButtonModel的行为,我遇到了一个奇怪的情况。 isRollover()方法不会返回预期的(根据我)值。Java Swing - JButton模型中的isRollover()值

这是我刚刚创建的示例代码:

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

/** 
* 
* @author rmu 
*/ 
public class NewClass extends JFrame { 

    private static final Logger logger = Logger.getLogger(NewClass.class.getName()); 

    static { 
     logger.setLevel(Level.INFO); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("Test MVC"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JButton btn = new JButton("Test button"); 
     final JLabel lbl = new JLabel(""); 

     btn.addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       logger.log(Level.INFO, "\nButton armed: " + btn.getModel().isArmed() 
         + "\nButton pressed: " + btn.getModel().isPressed() 
         + "\nButton selected: " + btn.getModel().isSelected() 
         + "\nButton rollover: " + btn.getModel().isRollover() 
       ); 
       lbl.setText(btn.getModel().isRollover() ? "Mouse is over the button" : "Mouse is NOT over the button"); 
      } 
     }); 

     frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS)); 
     frame.getContentPane().add(btn); 
     frame.getContentPane().add(lbl); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

回购步骤:

  • 将鼠标移动到按钮 - >一切正常
  • 按下鼠标按钮 - >一切正常
  • (不释放鼠标按钮)移动鼠标,使其不再位于按钮上 - > Ever ything的OK
  • (不释放...)再次将鼠标移动到按钮 - > isRollback()方法返回false(见日志和JLabel

它是正确的行为或错误?我想写一些使用这个属性的代码,我不确定我是否可以依赖它。

+0

[也许这是一个错误](http://stackoverflow.com/q/30581812/714968),使用SwingUtilities.isLeftMouseButton – mKorbel

回答

1

我不会依赖翻转行为。它并不是真正的标准化,因为它可以(&中的某些工具包)修改其行为。

也就是说,实现您自己的鼠标侦听器来获得您想要的行为应该是微不足道的。

2

它是正确的行为还是错误?

查看源代码,看看它在做什么。

BasicButtonListener你有这样的代码:

public void mouseEntered(MouseEvent e) { 
    AbstractButton b = (AbstractButton) e.getSource(); 
    ButtonModel model = b.getModel(); 
    if (b.isRolloverEnabled() && !SwingUtilities.isLeftMouseButton(e)) { 
     model.setRollover(true); 
    } 
    if (model.isPressed()) 
      model.setArmed(true); 
} 

当按下鼠标左键时侧翻未设置。

只需使用您自己的MouseListener并收听mouseEntered/mouseExited事件。