Java 在操作事件期间设置标签中的文本
可能重复:Java 在操作事件期间设置标签中的文本,java,swing,text,jbutton,jlabel,Java,Swing,Text,Jbutton,Jlabel,可能重复: 我正在使用JavaSwing开发一个GUI,其中使用了两个组件JButton和JLabel。JLabel的文本最初设置为“单击按钮”。单击按钮后,我希望JLabel的文本更改为“正在处理”,最后更改为“已处理” 因此,当我单击按钮时,控件转到ActionPerformed,在这里我使用setText()方法将JLabel的文本设置为“Processing”。ActionPerformed中的最后一条语句是使用setText()将JLabel的文本设置为“已处理” 当我运行程序时,标
我正在使用JavaSwing开发一个GUI,其中使用了两个组件JButton和JLabel。JLabel的文本最初设置为“单击按钮”。单击按钮后,我希望JLabel的文本更改为“正在处理”,最后更改为“已处理” 因此,当我单击按钮时,控件转到ActionPerformed,在这里我使用setText()方法将JLabel的文本设置为“Processing”。ActionPerformed中的最后一条语句是使用setText()将JLabel的文本设置为“已处理” 当我运行程序时,标签显示“单击按钮”。最后它变为“已处理”。但是,它从不显示“处理” 设置“正在处理”和“已处理”之间必须有延迟
JLabel
text,否则文本中的更改将太快而无法观察到
一种方法是在2个setText
调用之间使用一个。您的JButton
ActionListener
可能如下所示:
public void actionPerformed(ActionEvent e) {
label.setText("Processing...");
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
label.setText("Processed");
}
};
Timer timer = new Timer(1000, taskPerformer); // delay one sec
timer.setRepeats(false);
timer.start();
}
它现在不工作的原因是处理GUI刷新的Java线程也处理侦听器的事件。因此,当您调用
setText()
方法时,它会告诉GUI线程(称为事件分派线程的EDT)更新组件,但现在无法完成,因为EDT当前在执行代码的actionPerformed()
方法中
因此,我认为您应该将执行任何工作的代码放在一个新线程中,并更改JLabel的文本。因此,EDT会在actionPerformed()
中启动它,然后在JLabel的文本更改时可以自由更新GUI
类似这样的内容:(您必须实现run方法)
理想情况下,必须从EDT本身调用setText()
方法和其他更改组件的方法,以避免出现错误。。。我给你的例子不是这样的。如果要执行此操作,请使用以下方法:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
myLabel.setText("my text");
}
});
SwingUtilities.invokeLater(new Runnable() {
public void run() {
myLabel.setText("my text");
}
});