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. なぜ公開されているのですか?runがスレッドを実行することは理解していますが、なぜパブリックなのですか?

前もって感謝します

4

2 に答える 2

1

オンラインで簡単に入手できるJavaスレッドに関するいくつかの優れたチュートリアルを読む必要があります。少し調べてみると、ここに質問を投稿する前に答えを見つけることができます。

あなたの質問に対する簡単な答えは次のとおりです。

new Trial().start();

newキーワードは、クラスオブジェクトを作成するJava演算子であり、start()はスレッドの実行を開始します。このように書くこともできます。

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

つまり、Threadを拡張するクラスのオブジェクトを作成するたびに、start()を呼び出すと実行を開始する新しいスレッドが作成されます。

class Trial extends Thread

クラストライアルは、動作を継承するためにThreadクラスを拡張しており、独自の実装のためにrun()関数をオーバーライドすることができます。簡単に言うと、run()は、Threadがすべての作業を行う関数です。

public void run()

run()関数は派生クラス(つまり、この場合はTrial)でオーバーライドされるため、Trialクラスのオブジェクトを作成するだけでどこでもスレッドを作成して開始できるように、パブリックである必要があります。

それが役に立てば幸い。

于 2013-03-25T02:04:09.657 に答える
1

繰り返しになりますが、Swingスレッドはエラーになっていますが、それでも、スレッドを直接使用するのではなく、Swingタイマーを使用します。例えば:

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();
         }
      });
   }
}
于 2013-03-25T02:24:41.093 に答える