繁体   English   中英

我可以在ActionListener上使用get和set吗? 为什么不工作?

[英]Can I Use get and set on ActionListener? Why don't work?

见下文:

/ 这是我的主要 /

package br.com.general;

public class Main {

    public static void main(String[] args) {

        Wind w = new Wind();
        w.start();

        while(true){
            //System.out.printf("%b\n", w.button());
            if(w.button()){
                System.out.printf("xx %b\n", w.button());
            }
        }

    }

}

/ 这是我的带有一个按钮的JFrame窗口 /

package br.com.general;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Wind extends JFrame{

    private static final long serialVersionUID = 1L;
    Act a = new Act();

    public Wind() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JButton B = new JButton("on");

        getContentPane().setLayout(null);  

        B.setBounds(10, 10, 50, 30);
        B.addActionListener(a);

        add(B);
        setSize(100, 100);
    }

    public void start() {
        setVisible(true);
    }
    public boolean button(){
        return(a.button());
    }
    public void buttonOk(){
        a.zero();
    }
}

/ *最后是我的按钮的ActionListener * /

package br.com.general;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Act implements ActionListener {
    boolean s;
    public void actionPerformed(ActionEvent ae) {
        s = true;

    }
    public boolean button(){
        return(s);
    }
    public void zero(){
        s = false;
    }
}

如果运行,则可以看到它不起作用,但是如果在主目录中删除了“ //”并启用了“ System.out.printf(“%b \\ n”,w.button() );“ 它开始起作用...。为什么? 有人可以帮助我吗?

这个问题问得好! 在理想的情况下,无论是否注释掉第一个System.out.println(…) ,您的代码都将毫无问题地运行。

问题在于Java优化了您的代码,并且并不总是检索Act类中s标志的当前值。

为了避免这种(在这种情况下是错误的)优化,可以使用volatile修饰符: volatile boolean s; 这要求JVM 始终从内存中检索实际值并防止对其进行缓存,请参阅Java教程中的 Atomic Access

看来您有一个消耗所有资源的硬无限循环。 您可能应该在循环中插入较小的延迟(例如10-100ms)。 这可以使用Thread.wait()方法完成。 在您的情况下,延迟是由System.out.printf()产生的,因为控制台输出非常慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM