见下表:
/这是我的主要任务/
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());”它开始运作。。。。为什么?有人能帮我吗?
2条答案
按热度按时间r7s23pms1#
看起来你有一个消耗所有资源的硬无限循环。您可能应该在循环中插入小延迟(例如,10-100ms)。这可以使用thread.wait()方法完成。在您的例子中,延迟是由system.out.printf()产生的,因为控制台输出非常慢。
7qhs6swi2#
这是一个非常好的问题!在一个理想的世界里,你的代码可以毫无问题地运行,不管第一个
System.out.println(…)
是否被注解掉。问题是java优化了您的代码,并不总是检索您的代码的当前值
s
中的标志Act
班级。为了避免这种(在本例中是错误的)优化,可以使用
volatile
修饰语:volatile boolean s;
. 这要求jvm总是从内存中检索实际值,并防止缓存它,请参阅java教程中的原子访问。