5

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<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 です。このスイングの問題は Lion のせいにするべきですか、それとも何か間違ったことをしているのですか? ありがとうございました。

更新 1 : 私のneatbeans設定の画像 (役に立てば幸いです) 設定

4

2 に答える 2

5

1.6.0_26以下に示すJava バージョンの Leopard でテストされたコード。末尾の</html>タグにより、ロールオーバー時の強調表示の不具合が修正されました。

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

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<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();
            }
        });
    }
}
于 2012-04-06T00:19:59.060 に答える
0

わかりました。これはすでに非常によく回答されており、OPの質問はMac上で行われたことを私は知っていますが、この回答は共有する必要があります.

Windows 7 を使用している場合、テーマが「クラシック」に設定されている場合、ロールオーバー効果は機能しません。「基本」に設定すると、ロールオーバーが機能します。

于 2015-04-15T23:40:17.180 に答える