[英]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.