Java 如何在JFrame表单中多次设置组件

Java 如何在JFrame表单中多次设置组件,java,jframe,textfield,repaint,Java,Jframe,Textfield,Repaint,我在JFrame表单中尝试设置了两次文本字段,但设置的最后一个文本字段仍然存在。除了JFrame表单,我还可以成功设置更多次。比如说 class test extends JFrame { public static void main(String[] args) { test t = new test(); textfield.setText("Hello"); long a = System.currentTimeMillis(); long c = a;

我在JFrame表单中尝试设置了两次文本字段,但设置的最后一个文本字段仍然存在。除了JFrame表单,我还可以成功设置更多次。比如说

class test extends JFrame {
public static void main(String[] args) {
    test t = new test();
    textfield.setText("Hello");
    long a = System.currentTimeMillis();
    long c = a;
    while (c > a - 1000) {
        a = System.currentTimeMillis();

    }
    textfield.setText("Hello2");
}
static private JTextField textfield;
public test() {
    super();
    setSize(300, 300);
    textfield = new JTextField("Hello1");
    add(textfield);
    setVisible(true);
}}
上面的代码正在成功运行。一秒钟后,首先显示“Hello”,然后显示“Hello2”。但是在JFrame表单中,只显示“Hello2”而不是“Hello”

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
jTextField1.setText(“你好”);
长a=System.currentTimeMillis();
长c=a;
而(c>a-1000){
a=系统.currentTimeMillis();
}
jTextField1.setText(“Hello2”);
}                                        
/**
*@param指定命令行参数
*/
公共静态void main(字符串参数[]){
/*设置Nimbus的外观和感觉*/
//
/*如果Nimbus(在JavaSE6中引入)不可用,请使用默认的外观。
*详情请参阅http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
*/
试一试{
for(javax.swing.UIManager.LookAndFeelInfo:javax.swing.UIManager.getInstalledLookAndFeels()){
if(“Nimbus”.equals(info.getName())){
setLookAndFeel(info.getClassName());
打破
}
}
}捕获(ClassNotFoundException ex){
getLogger(deneme.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}catch(实例化异常){
getLogger(deneme.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}捕获(非法访问例外){
getLogger(deneme.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}catch(javax.swing.UnsupportedLookAndFeelException ex){
getLogger(deneme.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}
//
/*创建并显示表单*/
invokeLater(new Runnable()){
公开募捐{
新的deneme().setVisible(true);
}
});
}
我还搜索了
repaint()
validate()
revalidate()
方法。但是因为我的项目是JFrame表单,所以没有JFrame对象。因此,我不能使用这些方法


提前感谢您的回答。

这是因为在第二种情况下,在事件调度线程(EDT)上调用了
jButton1ActionPerformed()
方法,您会将该线程阻塞一秒钟。如果EDT被阻止,则不会更新UI。如果您希望文本在一秒钟后更改,则不应阻止EDT,而应使用一些背景,例如:

private void jButton1ActionPerformed( java.awt.event.ActionEvent evt ){

    jTextField1.setText( "Hello" );
    new javax.swing.SwingWorker< Void, Void >() {

        @Override
        protected Void doInBackground() throws Exception  {
            Thread.sleep( 1000 );
        }

        @Override
        protected void done() {
            jTextField1.setText( "Hello2" );
        }
    }.execute();   
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
jTextField1.setText(“你好”);
新javax.swing.SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
睡眠(1000);
}
@凌驾
受保护的void done(){
jTextField1.setText(“Hello2”);
}
}.execute();
}

不要使用活动等待(
while(c>a-1000)
)。改用
Thread.sleep()

你说的“没有运行”是什么意思?请解释当前行为和您期望的行为。您能更准确地说明您希望您的程序执行的操作吗?@KrzysztofKosmatka我的意思是文本字段仅显示“Hello2”。我希望在一秒钟后显示“Hello”然后是“Hello2”。Thanks@whyn0t我更新了它。谢谢。干净有效,谢谢Krzysztof Kosmatka;@K.塔哈:保持下去=]
private void jButton1ActionPerformed( java.awt.event.ActionEvent evt ){

    jTextField1.setText( "Hello" );
    new javax.swing.SwingWorker< Void, Void >() {

        @Override
        protected Void doInBackground() throws Exception  {
            Thread.sleep( 1000 );
        }

        @Override
        protected void done() {
            jTextField1.setText( "Hello2" );
        }
    }.execute();   
}