2012-02-08 61 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