2013-09-23 34 views
0

我想在我的java程序中做的是,當我按下按鈕時,它會以時間間隔在textfield中顯示文本。 即我按下按鈕然後jFrame彈出,有一個標誌,顯示了類似的文字: 第1條第二:「第一次」 隨後的時滯說1秒 那麼第二件事:「第二屆」Java睡眠不工作在循環中

我是一個新手,我試圖谷歌這個問題,但我找不到解決方案,即使在3-4小時後 我嘗試了很多東西:睡覺,嘗試ñ趕上...

請寫出答案非常簡單。

這是我的代碼: 在下面的代碼中,當按下按鈕時,jFrame出現但屏幕中出現白色,並且當總和結束時,其屏幕變爲灰色,並顯示答案....

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {           
    See.setVisible(true);//See is the JFrame 
    t007.setVisible(true);//Label in See 
    l2.setVisible(true);//TextField in See 
    int ran, g, d, col, ran2; 
    double y = 1000 * (Double.parseDouble(t2.getText())); 
    int x = (int) y; 
    d = 0; 
    double c = Math.pow(10, Integer.parseInt(t1.getText())); 
    col = Integer.parseInt(t3.getText()); 
    for (g = 0; g < col;) { 
     ran = (int) (Math.random() * (c)); // Random Number Creation Starts 
     if (ran > (c/10)) { 
      g = g + 1; 
      ran2 = ((int) (Math.random() * 10)) % 2; 
      if (ran2 == 1) { 
       ran = ran * (-1); 
      } 
      d = d + ran; 
      if (d < 0) { 
       ran = ran * (-1); 
       d = d + (2 * ran); 
      } 
      l2.setVisible(true); 
      t007.setText("" + ran); 
      System.out.println("" + ran); 
      jButton6.doClick(); 
      //Pausing (Sleep) 
      try { 
        Thread.sleep(x); 

      } catch (InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
      } 
      } 
      } 
      l2.setText("" + d); 
       }           
+0

使用'SwingWorker'提供後臺處理和同步備份到事件隊列。參見[Swing中的併發(http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)瞭解更多詳情 – MadProgrammer

+0

不要堵塞EDT(事件指派線程) - 的圖形用戶界面將「凍結」時發生。而不是調用'Thread.sleep(n)'實現一個Swing'Timer'來重複執行任務,或者一個'SwingWorker'執行長時間運行的任務。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

+0

嘿,我不能理解你,你能不能簡單地寫下代碼,然後告訴我什麼和如何。請 –

回答

1

Swing是一個單線程的框架,這是,所有的交互和UI的修改預計將發生在事件調度線程的上下文中。

EDT負責處理重繪請求等。

任何阻止EDT運行的東西(如Thread.sleep和循環很長時間)將阻止它處理事件,實際上「懸掛」您的應用程序,直到它變得暢通無阻...

現在,我試圖破譯你的程序試圖做...但失敗了,所以不是......我做了一個漂亮的反...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TickOver { 

    public static void main(String[] args) { 
     new TickOver(); 
    } 

    public TickOver() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextField field; 
     private JButton button; 
     private int tick; 
     private Timer timer; 

     public TestPane() { 

      field = new JTextField(10); 
      field.setEditable(false); 
      button = new JButton("Start"); 
      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        button.setEnabled(false); 
        tick = 0; 
        timer.start(); 
       } 
      }); 

      timer = new Timer(1000, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        field.setText(Integer.toString(++tick)); 
        if (tick > 4) { 
         timer.stop(); 
         button.setEnabled(true); 
        } 
       } 
      }); 
      timer.setInitialDelay(0); 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(field, gbc); 
      add(button, gbc); 

     } 
    } 
} 

乘坐在Concurrency in Swing更多細節仔細看......

+0

你好,我想這件事,但我沒有太多的想法如何在我的程序 –

+0

我不知道如何創建一個類添加此在我的代碼main中主要做了什麼 –

+0

自動有一些代碼,我不知道如何把這段代碼放在那裏;如何左看右看,以創建類n的所有 –

0

睡覺用戶界面線程是非常糟糕的做法。 (因爲這會導致應用程序停止響應),你應該把所有的代碼Runnable實例的Run()方法中:

java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       // Your code here. 
      } 
     }); 
+0

如果他睡在可運行它不會有什麼區別,你也運行它在美國東部時間... – assylias

+0

我應該把這一切,因爲我告訴uim完全新手 –

+0

我使用NetBeans,我只是在按鍵代碼和所有而不是像這樣,如何如何如何請解釋 –

1

你應該永遠睡在UI線程,因爲它使UI滯後。就好像這個過程需要時間來完成,用戶界面會卡住,用戶體驗會受到傷害。

使用其他機制如TimerSwingWorker

Concurrency in Swing

+0

做男人? –

+0

@DakshShah評論已經包含幫助你開始的鏈接。閱讀並詢問你是否仍然有問題。我也會添加該鏈接。 –

+0

什麼是一個線程,什麼是UI,以及如何定時器或擺動工人融入在我的計劃 –

0

的問題是,你運行事件調度線程上的長時間運行的循環。但是,這是必須調度應用程序的所有事件(如鼠標或鍵盤事件)的線程,但也會重新繪製導致用戶界面在每次變髒時重新繪製的事件。這意味着,在for循環運行時,用戶界面不會重新繪製,也不會處理任何其他事件。你的UI凍結! 您的jButton5ActionPerformed方法應儘快返回,以便事件分派線程可以處理其他事件。您的長時間運行操作應由後臺中的單獨線程運行。

一個很好的出發點是在Swing關於併發以下教程: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/

也許你可以使用SwingWorker類來執行你的工作背景: http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html