代码之家  ›  专栏  ›  技术社区  ›  Denys S.

这里有什么遗漏/错误?

  •  0
  • Denys S.  · 技术社区  · 14 年前

    import java.awt.BorderLayout;
    import java.awt.Button;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    
    public class JavaSwingTest extends JDialog {
        private JLabel m_countLabel;
    
        private Timer m_timer = new Timer();
    
        private class IncrementCountTask extends TimerTask {
            @Override
            public void run() {
                m_countLabel.setText(Long.toString(System.currentTimeMillis() 
    / 1000));
            }
        }
    
        private JavaSwingTest() {
            createUI();
    
            m_timer.schedule(new IncrementCountTask(), 1000, 1000);
        }
    
        private void createUI() {
            Button button1 = new Button("Action1");
            button1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    doLongOperation();
                }
    
            });
            add(button1, BorderLayout.NORTH);
    
            m_countLabel = new JLabel(Long.toString(System.currentTimeMillis() 
    / 1000));
            add(m_countLabel, BorderLayout.CENTER);
        }
    
        /**
         * Simulates an operation that takes time to complete.
         */
        private void doLongOperation() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // ignored for this test
            }
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            new JavaSwingTest().setVisible(true);
        }
    }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Andy Thomas    14 年前

    像大多数UI工具包一样,Swing不是线程安全的。setText()调用应转发到事件线程。

    SwingUtilities .invokeLater()或invokeAndWait()。

        2
  •  1
  •   Mark Peters    14 年前

    正如其他人所说, setText() javax.swing.Timer (这将调用EDT上已有的操作),而不是 java.util.Timer .

        3
  •  1
  •   trashgod    14 年前

    使用 SwingWorker 会允许你 doLongOperation() here