Java 在具有Action Listner的程序中,具有不同结果的歧义

Java 在具有Action Listner的程序中,具有不同结果的歧义,java,exception,actionlistener,jlabel,Java,Exception,Actionlistener,Jlabel,我是Java的初学者。这是我需要做的一个示例代码。我想将JLabel中的文本从另一个类中的另一个方法更改为“Hooray!”。它已成功编译,但在运行时,我每次运行都会得到不同的结果(即使代码中的一个字母也没有变化)。我在GUI和CLI中随机得到以下结果。我希望得到第一个结果。。。(我使用NetBeans生成GUI) GUI:“jLabel1”改为“万岁!” CLI:打印以下内容: GUI:“jLabel1”未更改 CLI:与第一个实例的结果相同 GUI:不显示任何内容。(不显示JLab

我是Java的初学者。这是我需要做的一个示例代码。我想将JLabel中的文本从另一个类中的另一个方法更改为“Hooray!”。它已成功编译,但在运行时,我每次运行都会得到不同的结果(即使代码中的一个字母也没有变化)。我在GUI和CLI中随机得到以下结果。我希望得到第一个结果。。。(我使用NetBeans生成GUI)

    • GUI:“jLabel1”改为“万岁!”
    • CLI:打印以下内容:
    • GUI:“jLabel1”未更改
    • CLI:与第一个实例的结果相同
    • GUI:不显示任何内容。(不显示JLabe)
    • CLI:与第一个实例的结果相同
  • 线程“AWT-EventQueue-0”java.lang.IllegalStateException中的异常:
  • 线程“main”java.lang.IllegalStateException中的异常:
  • 导入java.awt.event.ActionEvent;
    导入java.awt.event.ActionListener;
    导入javax.swing.Timer;
    公共类NewJFrame扩展了javax.swing.JFrame{
    公共静态字符串st;
    静态整数计数器;
    私有静态javax.swing.JLabel jLabel1;
    公共NewJFrame(){
    初始化组件();
    }
    私有组件(){
    jLabel1=newjavax.swing.JLabel();
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    jLabel1.setText(“jLabel1”);
    /*我使用NetBeans IDE生成了这个GUI…带有一个JLabel和一个JFrame*/
    javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(布局);
    layout.setHorizontalGroup(
    createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(89,89,89)
    .addComponent(jLabel1,javax.swing.GroupLayout.PREFERRED_SIZE,141,javax.swing.GroupLayout.PREFERRED_SIZE)
    .addContainerGap(170,简称最大值))
    );
    layout.setVerticalGroup(
    createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(89,89,89)
    .addComponent(jLabel1,javax.swing.GroupLayout.PREFERRED_SIZE,91,javax.swing.GroupLayout.PREFERRED_SIZE)
    .addContainerGap(120,简称最大值))
    );
    包装();
    }                      
    公共静态void main(字符串参数[]){
    invokeLater(new Runnable()){
    公开募捐{
    新建NewJFrame().setVisible(true);
    计时器计时器=新计时器(1000,新ActionListener(){
    @凌驾
    已执行的公共无效操作(操作事件e){
    计数器++;
    setLabel(st);
    系统输出打印项次(“执行的操作”+计数器);
    }
    });
    timer.setRepeats(真);
    timer.setCoalesce(真);
    timer.start();
    }
    });
    测试t=新测试();
    t、 run();
    }
    公共静态void setLabel(字符串x){
    jLabel1.setText(x);
    }
    }
    类测试扩展了NewJFrame{
    无效运行(){
    标签();
    System.out.println(“运行方法”);
    }
    无效标签(){
    st=“万岁!”;
    System.out.println(“标签方法”);
    }
    
    }
    您的期望是什么?显然,第一个…
    invokeLater
    完全按照它所说的做,它将
    Runnable
    传递给
    EventQueue
    “稍后进行inokved”,然后继续执行剩余的代码(
    newtest()
    run
    label
    ),到那时,EDT已经有机会处理
    Runnable
    并启动计时器,更改标签…然而,时间可能会根据您的系统发生的情况而改变…摆脱
    jLabel1
    设置标签的
    静态
    引用。它会解决问题吗?。。。
    
             label method;
             run method;
             action performed 1 ; action performed 2;..."