Java isRollover()方法在我的swing应用程序中不会产生事件

我正在读一本名为Swing:A Beginner’s guide的好书。 书中有这样的代码,它创建了一个按钮和一个标签,用于警告按钮的状态变化事件:

//Demonstrate a change listener and the button model package swingexample2_6; import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class ChangeDemo { JButton jbtn; JLabel jlab; public ChangeDemo() { //Create a new JFrame container JFrame jfrm = new JFrame("Button Change Events"); //Specify FlowLayout for the layout manager jfrm.getContentPane().setLayout(new FlowLayout()); //Give the frame an initial size jfrm.setSize(250, 160); //Terminate the program when the user closes the application jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create an empty label jlab = new JLabel(); //Make a button jbtn = new JButton("Press for Change Event Test"); //--Add change listener jbtn.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent ce) { ButtonModel mod = jbtn.getModel(); String what = ""; if (mod.isEnabled()) { what += "Enabled
"; } if (mod.isRollover()) { what += "Rollover
"; } if (mod.isArmed()) { what += "Armed
"; } if (mod.isPressed()) { what += "Pressed
"; } //Notice that this label's text is HTML jlab.setText("Current stats:
" + what); } }); //Add the components to the content pane jfrm.getContentPane().add(jbtn); jfrm.getContentPane().add(jlab); //Display the frame jfrm.setVisible(true); } public static void main(String[] args) { //Create the frame on the event dispatching thread SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new ChangeDemo(); } }); } }

除翻滚事件外,一切正常。 底层操作系统是Mac OS Lion。 我应该责怪狮子这个摆动问题还是我做错了什么? 谢谢。

更新1:我的neatbeans设置图片(我希望它有帮助) 设置http://sofzh.miximages.com/java/vdzg92.png

在Leopard上测试的代码,Java版本1.6.0_26如下所示。 尾随标记修复了翻转时突出显示的故障。

附录:使用下面更新的示例,添加setRolloverEnabled(true)允许模型按预期工作。 有趣的是,当isRollover()true时,Mac UI委托com.apple.laf.AquaButtonUI不执行任何isRollover() 。 如果它对您的应用程序很重要,则可以在以下谓词为true时执行所需的操作:

 System.getProperty("os.name").startsWith("Mac OS X") 

作为参考,此示例演示了setRolloverIcon()

 import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class ChangeDemo { private JButton jbtn; private JLabel jlab; public ChangeDemo() { JFrame jfrm = new JFrame("Button Change Events"); jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jfrm.setLayout(new GridLayout(0, 1)); jlab = new JLabel("", JLabel.CENTER); jbtn = new JButton("Press for Change Event Test"); jbtn.setRolloverEnabled(true); jbtn.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent ce) { ButtonModel mod = jbtn.getModel(); String what = ""; if (mod.isEnabled()) { what += "Enabled
"; } if (mod.isRollover()) { what += "Rollover
"; } if (mod.isArmed()) { what += "Armed
"; } if (mod.isPressed()) { what += "Pressed
"; } //Notice that this label's text is HTML jlab.setText("Current stats:
" + what + ""); } }); JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createEmptyBorder(50, 10, 0, 10)); panel.add(jbtn); jfrm.add(panel); jfrm.add(jlab); jfrm.pack(); jfrm.setLocationRelativeTo(null); jfrm.setVisible(true); } public static void main(String[] args) { //Create the frame on the event dispatching thread SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ChangeDemo changeDemo = new ChangeDemo(); } }); } }

好吧好吧。 我知道这已经得到了很好的回答,OP的问题出现在Mac上,但这个答案需要sharin’。

如果您使用的是Windows 7,如果将主题设置为“经典”,则翻转效果将不起作用。 将其设置为“基本”,翻转将起作用。