如何解决Java ActionListener在函数调用之前未执行第一个操作
我创建了一个连接到按钮的动作监听器。假设在印刷时更改标签的文字 然后执行一个函数调用。该函数调用非常密集,以至于程序似乎无法运行,因此标签仅显示“计算中,请稍候”。但是,在单击按钮时,在函数调用和滞后命中之前,标签永远不会显示。我尝试了各种显示标签的方法,还尝试添加一个sleep函数以增加函数调用之前的时间。有什么想法吗?
lineup.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
calculating.setText("Calculating Lineup! please be patient."); //The text to be displayed"
try {
Thread.sleep(2000);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
DecimalFormat df=new DecimalFormat("#.00");
lineupSet lineup = genetic.rungenetic(parser); //Function call causing hangup
QB.setText("QB: " + lineup.lineUp.get(0).getPlayerName()); //Text displayed after function
解决方法
您应该先看看Concurrency in Swing
从您的问题听起来,您想利用SwingWorker
作为一个(粗糙的)示例...
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;
public class SoTest {
public static void main(String[] args) {
new SoTest();
}
public SoTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setBorder(new EmptyBorder(8,92,8,92));
JLabel label = new JLabel("Make it so");
JButton button = new JButton("Push me");
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(label,gbc);
add(button,gbc);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("Rummaging through your stuff");
button.setEnabled(false);
SwingWorker<String,String> worker = new SwingWorker<String,String>() {
@Override
protected String doInBackground() throws Exception {
for (int index = 0; index < 5; index++) {
publish(Integer.toString(index));
Thread.sleep(1000);
}
return "";
}
@Override
protected void process(List<String> chunks) {
// Important,you will want to check chunks,as the
// API will consolidate calls to this if publish
// is fast enough
label.setText(label.getText() + ".");
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (worker.getState() == SwingWorker.StateValue.DONE) {
button.setEnabled(true);
label.setText("Make it so");
}
}
});
worker.execute();
}
});
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。