使用Thread.sleep()时,JTextField.setText()出现问题。这是我正在制作的基本计算器。当输入字段中的输入格式不正确时,我希望“输入错误”出现在输出字段中5秒钟,然后将其清除。当我将文本一次设置为“INPUT ERROR”(输入错误)时,setText()方法_确实_起作用,并且通过打印之间的文本,我发现它确实可以与setText(“”)一起使用。当我将Thread.sleep()放在它们之间时,就会出现问题。这是代码的SSCCE版本:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Pattern;
import javax.swing.*;
public class Calc {
static Calc calc = new Calc();
public static void main(String args[]) {
GUI gui = calc.new GUI();
}
public class GUI implements ActionListener {
private JButton equals;
private JTextField inputField, outputField;
public GUI() {
createFrame();
}
public void createFrame() {
JFrame baseFrame = new JFrame("Calculator");
baseFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
BoxLayout layout = new BoxLayout(contentPane, BoxLayout.Y_AXIS);
contentPane.setLayout(layout);
baseFrame.setContentPane(contentPane);
baseFrame.setSize(320, 100);
equals = new JButton("=");
equals.addActionListener(this);
inputField = new JTextField(16);
inputField.setHorizontalAlignment(JTextField.TRAILING);
outputField = new JTextField(16);
outputField.setHorizontalAlignment(JTextField.TRAILING);
outputField.setEditable(false);
contentPane.add(inputField);
contentPane.add(outputField);
contentPane.add(equals);
contentPane.getRootPane().setDefaultButton(equals);
baseFrame.setResizable(false);
baseFrame.setLocation(100, 100);
baseFrame.setVisible(true);
}
/**
* When an action event takes place, the source is identified and the
* appropriate action is taken.
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == equals) {
inputField.setText(inputField.getText().replaceAll("\\s", ""));
String text = inputField.getText();
System.out.println(text);
Pattern equationPattern = Pattern.compile("[\\d(][\\d-+*/()]+[)\\d]");
boolean match = equationPattern.matcher(text).matches();
System.out.println(match);
if (match) {
// Another class calculates
} else {
try {
outputField.setText("INPUT ERROR"); // This doesn't appear
Thread.sleep(5000);
outputField.setText("");
} catch (InterruptedException e1) {
}
}
}
}
}
}
我实际上不是在使用嵌套类,但我希望它能够为您包含在一个类中。很抱歉,GUI的外观如何,但这又是为了减少代码。重要部分(if (e.getSource()== equals)
)与我的代码保持不变。输入错误的最简单方法是使用字母。
使用时,Thread.sleep()
您正在主线程上执行此操作。这会将gui冻结5秒钟,然后更新outputField
。发生这种情况时,它将使用最后设置的文本,该文本为空白。
使用Swing计时器要好得多,下面的示例可以完成您要完成的任务:
if (match) {
// Another class calculates
} else {
outputField.setText("INPUT ERROR");
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){
outputField.setText("");
}
};
Timer timer = new Timer(5000, listener);
timer.setRepeats(false);
timer.start();
}
问题内容: 我正在制作一个程序,试图对在屏幕上移动的卡片进行动画处理,就好像您实际上是从桌子上拔出它一样。这是动画的代码: 此矩形对象位于jframe内的面板内。为了重新粉刷面板,我有这个: 这是一个线程,每隔50毫秒重新绘制一次gamePanel。 现在,我意识到这可能不是执行此类操作的最佳方法。如果有更好的方法来完成整个重新粉刷工作,请通知我! 但是,我遇到的问题是,当我为矩形调用命令时,它会
我最近一直在练习Java的swing特性,在我的一个扩展JPanel类的类中,我重写了方法,以便它将我的BufferedImage绘制到JPanel上。我也有一个方法在上面移动。在这个问题之前,我有一个问题,显示了移动的过程,因为它重新油漆太快。因此,我创建了一个名为的布尔变量,当图像仍在移动过程中时,该变量被设置为false。但是,现在我看到屏幕把整个图像拿走并放回原处,导致它眨眼。下面是我的基
我正在用摇摆计时器打卡NetBeans: 我只是用System.out.print来测试程序,它不是真正程序的一部分。我调用停止()方法,但计时器继续计数。此外,我通过但它的计数速度是原来的两倍。有人能帮忙吗? 编辑: 这是我的计时器(有点像SSCCE): 它不能正常工作,因为秒没有出现,但它确实显示了20次,这就是我想要的。这只是在它自己的应用程序中,在我的实际程序中更容易看到问题。 我注意到游
问题内容: 我正在尝试在ActionListener中停止计时器。以下是我正在尝试执行的代码。我打算停止在actionPerformed方法内满足特定条件时创建的计时器。timer.stop()不起作用,编译器不允许我这样做。 任何帮助。建议,建议将非常有帮助。 } 在此先感谢克里希南 问题答案: 也可能: 或者,使用事件对象获取源(并将其 强制转换为boo ): 或者,将计时器保留在实例变量中,
问题内容: 有人可以教我如何使用a 来达到以下目的: 当我单击鼠标时,我需要一个开始动画的多边形(例如旋转等简单动画);当我再次单击时停止动画。 我对理解工作方式没有任何问题,但对于实际的动画来说,没有任何问题。我尝试在方法中用while块模拟动画,在该方法中我将绘制,擦除和重绘多边形(例如,模拟旋转),但是在while内,applet不会监听点击。它只会在片刻之后收听。单击鼠标时,我需要摆动计时
null GrantPermissionRule是否停止了为其他人所宣传的工作?