微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java ActionListener在函数调用之前未执行第一个操作

如何解决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 举报,一经查实,本站将立刻删除。