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

tgabmvqs  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(347)

见下表:
/这是我的主要任务/

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;
    }
}

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

r7s23pms

r7s23pms1#

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

7qhs6swi

7qhs6swi2#

这是一个非常好的问题!在一个理想的世界里,你的代码可以毫无问题地运行,不管第一个 System.out.println(…) 是否被注解掉。
问题是java优化了您的代码,并不总是检索您的代码的当前值 s 中的标志 Act 班级。
为了避免这种(在本例中是错误的)优化,可以使用 volatile 修饰语: volatile boolean s; . 这要求jvm总是从内存中检索实际值,并防止缓存它,请参阅java教程中的原子访问。

相关问题