【问题标题】:Java isRollover() method does not produce an event in my swing applicationJava isRollover() 方法不会在我的 Swing 应用程序中产生事件
【发布时间】:2012-04-19 16:13:42
【问题描述】:

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

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

【问题讨论】:

  • 对我来说很好用...Windows 7 操作系统
  • @mre 此处相同(也使用 Win. 7 和后期 1.6 JRE)。使用的 JRE 版本是什么? (对 mre 和原始海报的问题。)
  • @AndrewThompson,jdk 1.6.0_29
  • @skiabox 我希望在倾向于该结论/策略之前,至少再看到一位 OS X 用户的回复。
  • sscce+1。

标签: java swing jbutton changelistener


【解决方案1】:

在 Leopard 上使用 Java 版本 1.6.0_26 测试的代码如下所示。尾随 &lt;/html&gt; 标记修复了翻转时的突出显示故障。

附录:使用下面的更新示例,添加 setRolloverEnabled(true) 可使模型按预期工作。有趣的是,当isRollover()true 时,Mac UI 委托com.apple.laf.AquaButtonUI 什么都不做。如果它对您的应用程序很重要,您可以在以下谓词为 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();
            }
        });
    }
}

【讨论】:

  • 随着时间的推移越来越有趣。
  • 我仍然没有得到结束 html 标记的翻转效果事件!
  • 原始帖子更新了新信息..(netbeans 设置)
  • @skiabox:抱歉,我无意中用javax.swing.plaf.metal.MetalLookAndFeel 进行了测试;以上。
  • 真棒答案垃圾神!也许 stackoverflow 应该在答案中添加星级,以便人们可以用 5 星对如此惊人的答案进行评分!thnx 再次!
【解决方案2】:

好吧好吧。我知道这已经得到了很好的回答,并且 OP 的问题是在 Mac 上,但这个答案需要分享。

如果您使用的是 Windows 7,如果您将主题设置为“经典”,则翻转效果将不起作用。将其设置为“基本”并且翻转将起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多