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

Class Trial 正在扩展一个 Thread 类以继承行为,并且能够为自己的实现覆盖 run() 函数。简而言之,run() 是 Thread 完成所有工作的函数。

public void run()

run() 函数在派生类中被覆盖(即在您的情况下为 Trial),因此它必须是公共的,以便您可以在任何地方创建和启动线程,只需创建 Trial 类的对象。

希望能帮助到你。

于 2013-03-25T02:04:09.657 回答
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();
         }
      });
   }
}
于 2013-03-25T02:24:41.093 回答