2013-03-25 100 views
0

我有以下代碼:螺紋聲明

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Try extends JFrame implements ActionListener{ 
JButton n1 = new JButton("1"); 
JButton n2 = new JButton("2"); 
JButton n3 = new JButton("3"); 
JButton show = new JButton("Show"); 

{ 
show.addActionListener(this); 
n1.setEnabled(false); 
n2.setEnabled(false); 
n3.setEnabled(false); 

} 

public Try(){ 
    super("Try"); 
    setVisible(true); 
    setSize(500, 200); 
    setLayout(new GridLayout(1, 4)); 
    add(n1); 
    add(n2); 
    add(n3); 
    add(show); 
} 

public void actionPerformed(ActionEvent a) { 
Object clicked = a.getSource(); 
if(show == clicked){ 
new Trial().start(); 
} 
} 

class Trial extends Thread{ 
    public void run(){ 
     try { 
      n1.setEnabled(true); 
      Thread.sleep(1000); 
      n1.setEnabled(false); 
      n2.setEnabled(true); 
      Thread.sleep(1000); 
      n2.setEnabled(false); 
      n3.setEnabled(true); 
      Thread.sleep(1000); 
      n3.setEnabled(false);  
     } catch (InterruptedException e){ 
     } 
} 
}  

    public static void main(String[] args){ 
     Try frame = new Try(); 
     frame.setVisible(true); 
    } 
    } 

我有一個關於這個特定部分的一些問題:

1.--->  new Trial().start(); 
2.--->  class Trial extends Thread 
3.--->  public void run() 
  1. 爲什麼他新的它,而不是隻是試用版?或者,第1行是「製作」線程的代碼?是在線程中啓動一個方法來創建它們?
  2. 它爲什麼擴展線程?爲什麼不能僅僅是階級審判?而且爲什麼它不公開?
  3. 爲什麼它是公開的?我知道運行線程,但爲什麼公共?

在此先感謝

+1

這是誰的代碼?如果你想從中學習,不要。由於它是從後臺線程對Swing組件狀態進行更改,因此編寫得不好,這會導致不可預知的崩潰。 – 2013-03-25 01:51:34

+1

先看一下[here](http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html),然後轉到src。 – Jayamohan 2013-03-25 01:56:36

+0

我製作了gui代碼,但我複製了線程代碼,我想學習它。 – 2013-03-25 01:58:02

回答

1

你應該閱讀上容易獲得在線Java線程一些不錯的教程,你可以找到一個小小的研究,你必須在這裏發佈您的問題之前,之後做你的答案。

簡短的回答你的問題是;

new Trial().start(); 

new關鍵字是創建類對象的java操作符,start()是開始執行線程。它也可以寫成這樣;

Trial t = new Trial(); 
t.start(); 

因此,這意味着,只要您創建延伸線,一個新的線程創建,將開始執行一個類的對象,當你調用start()

class Trial extends Thread 

類試驗是延伸線程類繼承行爲,並且能夠爲自己的實現覆蓋run()函數。簡而言之,run()是Thread完成所有工作的功能。

public void run() 

run()函數在派生類中重寫(即試用你的情況),因此它必須是公開的,這樣就可以創建並啓動一個線程的任何地方只是創造審判類的對象。

希望它有幫助。

+0

(第三句,低於Trial t = new Trial (); t。start();)所以它就像在我的GUI代碼中擴展JFrame,所以我不必像JFrame那樣做Try = new JFrame(「Try」)? – 2013-03-25 02:10:23

+0

當你的類擴展一個類時,它擴展了父類的行爲,所以當你創建你的類的對象,如Try t = new Try();所以「t」對象將有權訪問Try類以及父類的公共功能。 – nommyravian 2013-03-25 02:15:21

1

同樣,你的Swing線程是錯誤的,但是不管怎麼說,我都不會直接使用線程,而是會使用Swing Timer。例如:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Try extends JFrame implements ActionListener { 
    private static final int TIMER_DELAY = 1000; 
    JButton n1 = new JButton("1"); 
    JButton n2 = new JButton("2"); 
    JButton n3 = new JButton("3"); 
    private JButton[] buttons = {n1, n2, n3}; 
    JButton show = new JButton("Show"); 
    private Timer timer = null; 

    public Try() { 
     super("Try"); 
     // setSize(500, 200); 
     setLayout(new GridLayout(1, 4)); 
     add(n1); 
     add(n2); 
     add(n3); 
     add(show); 

     show.addActionListener(this); 
     n1.setEnabled(false); 
     n2.setEnabled(false); 
     n3.setEnabled(false); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
    } 

    public void actionPerformed(ActionEvent a) { 
     Object clicked = a.getSource(); 
     if (show == clicked && timer == null) { 
     timer = new Timer(TIMER_DELAY, new TimerListener()); 
     timer.setInitialDelay(0); 
     timer.start(); 
     } 
    } 

    private class TimerListener implements ActionListener { 
     private int count = 0; 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
     for (JButton btn : buttons) { 
      btn.setEnabled(false); 
     } 

     if (count != buttons.length) { 
      buttons[count].setEnabled(true); 
      count++; 
     } else { 
      timer.stop(); 
      timer = null; 
     } 
     } 
    } 

    private static void createAndShowGui() { 
     new Try().setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
}