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

时间:2012-08-24 16:15:13

标签: java concurrency actionlistener

见下文:

/ 这是我的主要 /

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());"它开始运作.... 为什么?有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

这是一个非常好的问题!在理想的世界中,无论第一个System.out.println(…)是否被注释掉,您的代码都可以毫无问题地运行。

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

为了避免这种情况(在这种情况下是错误的)优化,您可以使用volatile修饰符:volatile boolean s;。这要求JVM 始终从内存中检索实际值并阻止缓存它,请参阅Atomic Access in The Java Tutorials

答案 1 :(得分:0)

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