Java JTextField setText()方法未更新字段

Java JTextField setText()方法未更新字段,java,swing,Java,Swing,我正试图通过setText()方法更新JTextField文本。然而,当我尝试这样做时,似乎什么也没有发生。我仔细检查了调试器,确定情况确实如此payField是我正在使用的JTextField实例 代码如下: public void payBill(double payment) { if((this.bill - payment) > 0) payField.setText("Bill not completely paid! You still owe "

我正试图通过
setText()
方法更新
JTextField
文本。然而,当我尝试这样做时,似乎什么也没有发生。我仔细检查了调试器,确定情况确实如此
payField
是我正在使用的
JTextField
实例

代码如下:

public void payBill(double payment) {

    if((this.bill - payment) > 0)
        payField.setText("Bill not completely paid! You still owe " + "$" + (this.bill - payment));
    else {
        payField.setText("Thank you for choosing Team Turbo!");//Not updating!
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        payFrame.setVisible(false);
        System.exit(0);
    }


}
从视觉上看,调用此方法后不会发生任何事情:

知道这是怎么回事吗?整个GUI在一个
SwingUtilities.invokeLater
线程中运行,只是为了澄清一下。

这个

try {
    Thread.sleep(1500);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
payFrame.setVisible(false);
System.exit(0);
他非常可疑

Swing是一个单线程API。也就是说,任何长时间运行或阻塞操作都会阻止UI被更新

在您的情况下,我可能会建议使用Swing
计时器
,它将在指定的延迟后触发回调,而不会阻塞UI

首先,请查看并获取更多详细信息

try {
    Thread.sleep(1500);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
payFrame.setVisible(false);
System.exit(0);
他非常可疑

Swing是一个单线程API。也就是说,任何长时间运行或阻塞操作都会阻止UI被更新

在您的情况下,我可能会建议使用Swing
计时器
,它将在指定的延迟后触发回调,而不会阻塞UI


首先看一看,了解更多细节

我刚刚删除了Thread.sleeps,但JTextField仍然没有更新。还有什么其他想法吗?这可能表明您正在交互的字段和屏幕上的字段不一样,但因为存在
系统。退出(0)语句,我不知道是什么
payFrame.setVisible(false)正在运行,只是猜测工作正常,我刚刚删除了Thread.sleeps,但是JTextField仍然没有更新。还有什么其他想法吗?这可能表明您正在交互的字段和屏幕上的字段不一样,但因为存在
系统。退出(0)语句,我不知道是什么
payFrame.setVisible(false)正在执行,这只是猜测工作,也许在JTextField#setText()方法之后尝试验证JTextField:
payField.validate()。您确定1.5秒的时间足以让用户吸收显示的信息吗?更好的方法是使用带有确认对话框的JOptionPane,这样用户就有时间确认显示的内容,并可以选择一个按钮将其取消。如果您不喜欢默认的JTextField#setText()方法:
payField.validate(),则可以将自定义的JPanel添加到JOptionPane确认对话框中。您确定1.5秒的时间足以让用户吸收显示的信息吗?更好的方法是使用带有确认对话框的JOptionPane,这样用户就有时间确认显示的内容,并可以选择一个按钮将其取消。如果不喜欢默认的JPanel,可以将自定义JPanel添加到JOptionPane确认对话框中。