我有以下代码:
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()
提前致谢
答案 0 :(得分: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类对象的任何地方创建和启动一个线程。
希望它有所帮助。
答案 1 :(得分: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();
}
});
}
}