2012-02-08 37 views
0

我创建了一个用户界面,可以将某些数据发送到函数。但是,我一路上遇到了一些错误。我会详细解释一些我的编码。首先,我的函数将被调用,并且一些数据将被发送到另一个类文件。Java,无法接收来自不同类文件的数据

这是我的用户界面代码(我检查了它,它工作正常)

private void startActionPerformed(java.awt.event.ActionEvent evt) { 
int x1 = 0; 
int x2 = 0;          
test.sbutton(x1, x2);} 

接下来,我start.java文件sbutton功能原件。它会在内部调用一个定时器功能。

public class Start { 
Timer timer = new Timer(); 
    public void sbutton(final int x1, final int x2) { 
      timer.scheduleAtFixedRate(new Cost() { 
       public void active() { 
         super.run(x1, x2); 
         new Thread(new Runnable() { 
            public void run() }{ //some function 
      }).start(); 
} 
}, 1*1000, 30*1000); 

cost.class函数代码假设接收x1和x2。

public class Cost extends TimerTask{ 

// @Override 
public void run(int x1, int x2) { 
Calendar rightNow = Calendar.getInstance(); 
Integer hour = rightNow.get(Calendar.HOUR_OF_DAY); 
Integer min = rightNow.get(Calendar.MINUTE); 

if (hour== x1 && min == x2) {} 

但是,我收到一条错误消息,无法编译。我的错误消息是“成本不是一个抽象的,不覆盖抽象方法运行()”有人可以识别错误,我一直在这里停留超过4小时。所有帮助表示赞赏!

回答

0

TimerTask是一个Runnable,这意味着您需要实现抽象方法void run()。 代码中的运行方法有错误的签名。

+0

你可以重新编辑代码?我将能够掌握你的意思.. – Eugene 2012-02-08 14:43:57

1

扩展TimerTask时,大多数u提供了run()方法的实现,它不接受任何参数。我已经添加了两个参数x1和x2 ...

+0

x1和x2被添加,因为我想用值来运行run(),所以这个数据可以发送到Cost.run() – Eugene 2012-02-08 14:45:01

1

您试图重新定义Start类中的Cost类,这是不允许的。您可以尝试

Cost myArgument = new Cost(); 
timer.scheduleAtFixedRate(myArgument); 

假设Cost将正确的类扩展为可接受的参数。如果您需要通过x1和x2,定义一个构造成本,使其

Cost myArgument = new Cost(x1,x2); 
+0

我认为这是错误的答案。显然,必须实现TimerTask的抽象run()方法。 – 2012-02-08 14:32:42

1

的编译器错误是从成本其实是扩大TimerTask的,并没有覆盖所有的TimerTask的抽象方法。在这种情况下,这是运行方法。

要纠正你需要要么使成本抽象的编译错误:

public abstract Cost extends TimerTask { 
... 

或实现方法:

public Cost extends TimerTask { 

    @Override 
    public void run() { // no arguments 
    // your own run code 
    } 
... 

现在,通过X1和X2值到成本对象依赖在上面采取的方法。如果你想使用抽象成本类,你可以使用匿名子类,重写run方法,使用X1,X2值:如果您选择直接实现成本的run方法

timer.scheduleAtFixedRate(new Cost() { 
    public void run() { 
     // call your existing run(x1, x2) method 
     run(x1, x2); 
    } 
}, 1 * 1000, 30 * 1000); 

,提供在成本构造函数接受的价值观和以后使用他们当run方法由调度

public Cost extends TimerTask { 
    private final int x1; 
    private final int x2; 

    public Cost(int x1, x2) { 
     super(); 
     this.x1 = x1; 
     this.x2 = x2; 
    } 

    @Override 
    public void run() { 
     // call your existing run(x1, x2) method 
     run(x1, x2); 
    } 
    ... 

调用采用这种方法,调度变为:

timer.scheduleAtFixedRate(new Cost(x1, x2), 1 * 1000, 30 * 1000); 
+0

当我把run(x1,x2)的时候,我仍然有抽象的错误?我尝试着将run run的参数留空,但是线程看起来没有工作 – Eugene 2012-02-08 15:18:00

+0

new Thread(new Runnable(){public void run()}在我选择使用第二种方法时似乎没有运行 – Eugene 2012-02-08 15:38:50

+0

@Eugene you应该不需要线程匿名内部类,一旦你用Timer计划了Cost任务,Timer就有责任在规定的时间调用Cost#run()方法,你不需要创建一个单独的线程来启动或运行计时器 – 2012-02-08 16:11:47