课设编写聊天程序时遇到一个问题:
后台运行类需要在界面类的JButton遇到点击事件后得到JTextField的输入内容,JButton没有自带判断点击的方法,JButton注册的ActionListener不能将字符串返回。
解决方法:
使用一个boolean变量 isClick = false判断是否被点击。为JButton注册监听器,点击事件触发后isClick = true。定义函数用while循环检测!isClick,跳出后执行,返回变量。
可用一个简单的测试程序描述:
package testClass;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class statictest {
boolean isClick = false;
public statictest() {
JFrame frame = new JFrame();
JButton btn = new JButton("send");
frame.add(btn);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(isClick);
isClick = true;
System.out.println(isClick);
}
});
}
public String func() {
while(!isClick) {
// try {
// Thread.sleep(1);
// } catch (InterruptedException e1) {
// e1.printStackTrace();
// }
}
isClick = false;
return "Text";
}
public static void main(String[] args) {
statictest test = new statictest();
while(true) {
System.out.println(test.func());
}
}
}
注意,这里引发了一个新问题:
若func()中循环体为空,运行后得到的结果为
false
true
true
true
true
true
解决方法:
循环体内添加执行语句
System.out.print("");
或
while(!isClick) {
try {
Thread.sleep(1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
则输出为:
false
true
Text
false
true
Text
false
true
Text
false
true
Text
目前还清楚造成原因。