2013-12-15 24 views
1

我想爲項目編寫一個簡單的退休計算器。

我正在嘗試獲取文檔偵聽器,以便從不同的文本字段獲取輸入並將其用於我的計算。Document Listener java「無法實例化類型DocumentListener」

出於某種原因,我無法讓DocumentListener實例化,並且出現錯誤。我認爲我缺乏對如何做到這一點的理解。

那是給我的錯誤代碼的具體線路是這樣的:

DocumentListener DL = new DocumentListener(); 

這裏是一流的,我嘗試使用此:

import javax.swing.*; 
import javax.swing.event.*; 

import java.awt.*; 
import java.awt.event.*; 

public class TextFields extends JPanel implements DocumentListener 
{ 
    public TextFields() 
    { 
     setLayout(new GridLayout(5,1)); 
     setFont(new Font("Tahoma", Font.PLAIN, 14)); 

     DocumentListener DL = new DocumentListener(); 

     JTextField age = new JTextField("Age"); 
     age.getDocument().addDocumentListener(DL); 
     JLabel ageLabel = new JLabel("Age: "); 

     JTextField initialSavings = new JTextField("Intial Savings"); 
     JLabel ISLabel = new JLabel("Inital Savings: "); 

     JTextField ageRetire = new JTextField("Retirement Age"); 
     JLabel RALabel = new JLabel("Retirement Age: "); 

     JTextField inflation = new JTextField("Inflation Rate"); 
     JLabel inflationLabel = new JLabel("Inflation Rate: "); 

     JTextField dailySavings = new JTextField("Daily Savings"); 
     JLabel DSLabel = new JLabel("Daily Savings: "); 

     JTextField DeathAge = new JTextField("Age Of Death"); 
     JLabel DALabel = new JLabel("When will you die? "); 

     JTextField retirementIncome = new JTextField("Retirement Income:"); 
     JLabel RILabel = new JLabel("Retirement Income: "); 

     JTextField interest = new JTextField("Interest Rate"); 
     JLabel interestLabel = new JLabel("Interest: "); 

     add(ageLabel); 
     add(age); 

     add(ISLabel); 
     add(initialSavings); 

     add(RALabel); 
     add(ageRetire); 

     add(inflationLabel); 
     add(inflation); 

     add(DSLabel); 
     add(dailySavings); 

     add(DALabel); 
     add(DeathAge); 

     add(interestLabel); 
     add(interest); 

     add(RILabel); 
     add(retirementIncome);   
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void insertUpdate(DocumentEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     // TODO Auto-generated method stub 

    } 
} 

自從我開始程序設計師,我將不勝感激簡單的答案,不需要大量的知識才能理解。

非常感謝您的時間和幫助! Roy。

回答

1

短版:

... 
    // DocumentListener DL = new DocumentListener(); 

    JTextField age = new JTextField("Age"); 
    age.getDocument().addDocumentListener(this); 
    ... 

龍版本:

首先,我要給你的錯誤解釋。之後,我將包含適合您需求的特殊情況。

這個錯誤意味着你的DocumentListener是一個抽象類或一個接口(閱讀這兩個,然後你會明白)。

的解決方法是,找它的子類(按CTRL +Ť類名是在Eclipse IDE編輯器中選擇),或者創造一個你將其實例化一個匿名類權(見下面的例子)。請記住,實例化接口通常不是一個好主意(除非知道自己在做什麼),即接口應該由不同的類實現,然後實例化THOSE類。

DocumentListener dl = new DocumentListener() 
{ 
    // implement abstract methods here 
}; 

認識到這一點,我們現在擁有這一切particularise你的代碼。

當附加聽衆不同的元素(通常,聽衆接口),代碼標準是給收聽者直接添加作爲匿名類作爲API參數,像這樣:

age.getDocument().addDocumentListener(new DocumentListener() 
{ 
    // implement necessary methods here 
}); 

A quick Google Search即刻告訴我你需要在那裏實施什麼方法。最後,你的代碼應該是這樣的:

age.getDocument().addDocumentListener(new DocumentListener() 
{ 
    public void changedUpdate(DocumentEvent e) 
    { 

    } 

    public void insertUpdate(DocumentEvent e) 
    { 

    } 

    public void removeUpdate(DocumentEvent e) 
    { 

    } 
}); 

裏面這些方法,無論你想與接受的事件,你可以這樣做(DocumentEvent型 - 閱讀的javadoc)


另一種方式來做到這一點(你已經開始做的方式)是直接在你的工作類中實現DocumentListener,然後在那裏實現這些方法(就像你做的那樣 - 注意在你的類的最後有三個重寫的方法)。在這種情況下,全部您需要做的是告訴age.getDocument()它可以找到偵聽器的位置。

age.getDocument().addDocumentListener(this); 

通過寫this爲監聽器,它意味着當DocumentEvent s的拋出,執行將通過有你的那些方法(changedUpdateinsertUpdateremoveUpdate)。

0

正如你可以在你的TextFields類聲明中看到的,你正在實現DocumentLstener,這意味着這是一個接口,你不能實例化一個接口。 這個

DocumentListener DL = new TextFields(); 

更換有問題的線以來的TextField已實施的DocumentListener接口,一切都會好起來。 或者您可以爲偵聽器使用單獨或內部類。