El método Java isRollover () no produce un evento en mi aplicación swing

Estoy leyendo un gran libro llamado Swing: Guía para principiantes. Hay un código en el libro que crea un botón y una etiqueta que alerta sobre los eventos de cambio de estado del botón:

//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(); } }); } }

Todo está funcionando bien, excepto para el evento de rollover. El sistema operativo subyacente es Mac OS Lion. ¿Debo culpar a Lion por este problema de swing o estoy haciendo algo mal? Gracias.

Actualización 1: Configuración de mi imagen de configuración de neatbeans (espero que ayude) http://sofes.miximages.com/java/vdzg92.png

Código probado en Leopard con Java versión 1.6.0_26 muestra a continuación. La etiqueta de seguimiento corrigió un problema de resaltado en el rollover.

Anexo: Al usar el ejemplo actualizado a continuación, agregar setRolloverEnabled(true) permite que el modelo funcione como se espera. Curiosamente, el delegado de la interfaz de usuario de Mac, com.apple.laf.AquaButtonUI , no hace nada cuando isRollover() es true . Si es importante para su aplicación, puede realizar la acción deseada cuando el siguiente predicado sea true :

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

Para referencia, este ejemplo demuestra 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(); } }); } }

Bien bien. Sé que esto ya ha sido respondido realmente bien, y la pregunta del OP estaba en una Mac, pero esta respuesta necesita ser compartida.

Si está en Windows 7, los efectos de rollover no funcionarán si tiene el tema configurado en “Clásico”. Establézcalo en “Básico” y las reinversiones funcionarán.