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

标签 java swing jbutton changelistener

我正在阅读一本名为 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。 我应该把这个 Swing 问题归咎于 Lion 还是我做错了什么? 谢谢。

更新 1:我的 neatbeans 设置图片(希望对您有所帮助) settings

最佳答案

Java 版本的 Leopard 上测试的代码 1.6.0_26如下所示。尾随 </html>标签修复了翻滚时的突出显示故障。

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

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

作为引用,这个example演示 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();
            }
        });
    }
}

关于Java isRollover() 方法在我的 swing 应用程序中不产生事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10036787/

相关文章:

java - 从 getSource 更改 JButton 上的格式

Java:使用 BoxLayout 在 JPanel 中垂直移动 JButton

java - 快速排序实现: nearly sorted when using random pivot

java - Blocking IO 到底什么时候阻塞?

java - 在单击事件上更改 JButton

java - 如何针对特定列过滤 JTable?

java - 如何改变JButton的位置和大小?

java - JButton 不发送操作命令

Java诗歌回文检查器: Iterate through array matching elements in order

Java:文件写入错误,访问被拒绝