2012-04-05 12 views
5

Czytam wspaniałą książkę o nazwie Swing: A Beginner's guide. Jest to kod w książce, która tworzy przycisk i etykietę, która informuje o wydarzeniach ze zmianą stanu przycisku w:Metoda Java isRollover() nie generuje zdarzenia w mojej aplikacji swingowej

//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<br>"; 
       } 
       if (mod.isRollover()) { 
        what += "Rollover<br>"; 
       } 
       if (mod.isArmed()) { 
        what += "Armed<br>"; 
       } 
       if (mod.isPressed()) { 
        what += "Pressed<br>"; 
       } 

       //Notice that this label's text is HTML 
       jlab.setText("<html>Current stats:<br>" + 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(); 
      } 
     }); 
    } 
} 

Wszystko działa poprawnie z wyjątkiem przypadku dachowania. Podstawowy system operacyjny to Mac OS Lion. Czy powinienem winić Lwa za ten problem z huśtaniem, czy też robię coś nie tak? Dziękuję.

Aktualizacja 1: Moje ustawienia neatbeans obraz (mam nadzieję, że to pomaga) settings http://i44.tinypic.com/vdzg92.png

+2

działa dobrze dla mnie ... Windows 7 OS – mre

+2

@mre Same tutaj (również przy użyciu Win 7 z końca 1.6 JRE). Jaka jest wersja JRE? (Pytanie do obu i oryginalnego plakatu.) –

+1

jdk używany jest 1.6.0 – skiabox

Odpowiedz

5

Kod jak testowany na Leopard z Java wersji 1.6.0_26 poniżej. Znacznik końcowy podążał za usterką podświetlania podczas przewracania.

Dodatek: Użycie zaktualizowanego przykładu poniżej, dodanie setRolloverEnabled(true) pozwala modelowi pracować zgodnie z oczekiwaniami. Co ciekawe, delegat Mac UI, com.apple.laf.AquaButtonUI, nie robi nic, gdy isRollover() jest true. Jeśli jest to ważne dla aplikacji, można podjąć działania, gdy pożądany następujące orzeczenie jest true:

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

Dla porównania, ten example demonstruje 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<br>"; 
       } 
       if (mod.isRollover()) { 
        what += "Rollover<br>"; 
       } 
       if (mod.isArmed()) { 
        what += "Armed<br>"; 
       } 
       if (mod.isPressed()) { 
        what += "Pressed<br>"; 
       } 

       //Notice that this label's text is HTML 
       jlab.setText("<html>Current stats:<br>" + what + "</html>"); 
      } 
     }); 

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

Z biegiem czasu staje się coraz bardziej interesujące. – skiabox

+0

Nadal nie otrzymuję efektu efektu rollover z zamykającym tagiem HTML! – skiabox

+0

+1, działa poprawnie na Windows 7 z 1.7.0_03 :-) –

0

OK dobrze. Wiem, że odpowiedź na to pytanie została już naprawdę dobrze odebrana, a pytanie OP dotyczyło komputera Mac, ale ta odpowiedź wymaga sharin ".

Jeśli jesteś w systemie Windows 7, efekty najazdu nie będą działały, jeśli masz ustawiony motyw "Classic". Ustaw na "Podstawowy" i będą działać najazdy.

Powiązane problemy