2

见下文:

/这是我的主要/

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

4

2 回答 2

0

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

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

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

于 2012-09-30T23:21:44.323 回答
0

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

于 2012-09-30T23:27:38.773 回答