Java 为什么定时器类的start方法没有定义?

Java 为什么定时器类的start方法没有定义?,java,Java,这可能是语法错误,但我不这么认为,因为我直接从一本书中复制了这个程序。代码行“t.start();”下面有一行错误,表示start()方法未定义。起初,我认为start()方法不存在,但我在库中查找了它。问题是您正在声明自己的Timer类-因此Timer t=new Timer()指的是您的类,而不是javax.swing.Timer,并且您没有声明start方法。我很确定您想要使用javax.swing.Timer类。因此,您希望删除import javax.swing.Timer.*行,并将

这可能是语法错误,但我不这么认为,因为我直接从一本书中复制了这个程序。代码行“t.start();”下面有一行错误,表示start()方法未定义。起初,我认为start()方法不存在,但我在库中查找了它。

问题是您正在声明自己的
Timer
类-因此
Timer t=new Timer()
指的是您的类,而不是
javax.swing.Timer
,并且您没有声明
start
方法。我很确定您想要使用
javax.swing.Timer
类。因此,您希望删除
import javax.swing.Timer.*行,并将
计时器
类重命名为其他类

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer.*;

class Timer {

    public static void main(String[] args) {
        JFrame frame = new JFrame();

        final int FIELD_WIDTH = 20;
        final JTextField textField = new JTextField(FIELD_WIDTH);

        frame.setLayout(new FlowLayout());
        frame.add(textField);

        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                Date now = new Date();
                textField.setText(now.toString());
            }
        };

        final int DELAY = 1000;

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

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}
话虽如此,您并没有告诉计时器做任何事情…

虽然正确,但您可以用另一种方法解决它。将
计时器的初始化更改为

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

public class TimerTest {
    ...
}

按照以下步骤执行代码:

javax.swing.Timer t = new javax.swing.Timer(DELAY, listener);
t.start();
注意:更改类名后,您将得到一个编译错误,说明使用Timer类存在歧义。因为您已经导入了util和swing包(这两个包包含Timer类)

现在将代码行更改为

Change your class name to some other name.
作为


如果你能明智地缩进你所有的代码,这会很有帮助。缩进的方式有什么问题?问题是它几乎没有缩进。{}中的代码应该比{}缩进一个缩进。从类名的混乱中可以清楚地看出,你根本不是“直接从书中复制这个程序”:你改变了一些东西。@igknighton:现在Richard Tingle已经为你缩进了它(尽管我会进一步改进)。第一个版本很糟糕。但是堆栈溢出并不能很好地处理选项卡-在发布之前,您应该将它们转换为空格,并使用预览检查代码是否正常。这会起作用-但会造成不必要的混乱,依我看。鉴于他声明的类本身不是计时器,因此将其称为
timer@JonSkeet:你说得对。这不适合这种情况。
Timer t = new Timer();
javax.swing.Timer t = new javax.swing.Timer(DELAY, listener);
t.start();