2012-04-05 11 views
5

私はSwing:A Beginner's guideという素晴らしい本を読んでいます。 あり、ボタンとボタンの状態変化イベントに警告ラベルを作成する本の中で、このコードは次のとおりです。Java isRollover()メソッドは、スイングアプリケーションでイベントを生成しません。

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

すべてがロールオーバーイベントを除いて正常に動作しています。 基本となるオペレーティングシステムはMac OS Lionです。 このスイングの問題に対してライオンを責めるべきか、何か間違っていますか? ありがとうございます。

アップデート1:私のneatbeans設定絵は(私はそれが役に立てば幸い) settings http://i44.tinypic.com/vdzg92.png

+2

私のためにうまくいきます... Windows 7 OS – mre

+2

@mreここでも同じです(Windows 7の場合は、1.6 JREの遅れがあります)。使用されるJREのバージョンは何ですか? –

+1

jdk used 1.6.0 – skiabox

答えて

5

コードを以下に示したJavaバージョン1.6.0_26でLeopard上でテストされて。末尾の</html>タグは、ロールオーバー時に強調表示グリッチを修正しました。

補足:以下の更新された例を使用して、setRolloverEnabled(true)を追加すると、モデルが期待どおりに機能します。興味深いことに、Mac UIの代理人com.apple.laf.AquaButtonUIは、isRollover()trueのときは何もしません。それはあなたのアプリケーションにとって重要な場合は、次の述語がtrueあるとき、あなたは必要な行動を取ることができます。

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

、このexamplesetRolloverIcon()を示しています。

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

これは時間の経過とともにより面白くなっています。 – skiabox

+0

私は閉じたhtmlタグでロールオーバー効果イベントを得られません! – skiabox

+0

+1、1.7.0_03とWindows 7でうまく動作します:-) –

0

大丈夫です。私はこれがすでに本当にうまく答えられていることを知っています。そして、OPの質問はMac上にありましたが、この答えにはシャリンが必要です。

Windows 7の場合、テーマが「クラシック」に設定されていると、ロールオーバーエフェクトは機能しません。 「基本」に設定すると、ロールオーバーが機能します。

関連する問題