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