文档侦听器java“;无法实例化类型DocumentListener";

文档侦听器java“;无法实例化类型DocumentListener";,java,swing,jtextfield,documentlistener,Java,Swing,Jtextfield,Documentlistener,我正试图为一个项目编写一个简单的退休计算器。 我正在尝试获取一个文档侦听器,这样我就可以从不同的文本字段中获取输入,并在计算中使用它们 由于某种原因,我无法让DocumentListener实例化,结果出现了一个错误。我想我不知道该怎么做 给我一个错误的特定代码行是: DocumentListener DL = new DocumentListener(); 下面是我尝试使用的类: import javax.swing.*; import javax.swing.event.*; impor

我正试图为一个项目编写一个简单的退休计算器。

我正在尝试获取一个文档侦听器,这样我就可以从不同的文本字段中获取输入,并在计算中使用它们

由于某种原因,我无法让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

    }
}
因为我是一名程序员,所以我会很感激那些不需要大量知识就能理解的简单答案

非常感谢您的时间和帮助! 罗伊。

短版:

长版本:

首先,我要给你错误的解释。在此之后,我将提供一个适合您需要的特殊案例

这个错误意味着您的
DocumentListener
要么是一个抽象类,要么是一个接口(阅读这两个方面的内容,您就会明白了)

解决方案是查找它的子类(在EclipseIDE编辑器中选择类名时按CTRL+T),或者在实例化它的地方创建一个匿名类(参见下面的示例)。请记住,实例化接口通常不是一个好主意(除非您知道自己在做什么),即接口应该由单独的类实现,然后实例化这些类

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

知道了这一点,我们现在必须将所有这些具体化到您的代码中

将侦听器附加到不同元素(通常,侦听器是接口)时,代码标准是将侦听器作为匿名类直接添加为API参数,如下所示:

age.getDocument().addDocumentListener(new DocumentListener()
{
    // implement necessary methods here
});
立即告诉我您需要在那里实现哪些方法。最后,您的代码应该如下所示:

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);
通过以侦听器的身份编写
,这意味着当抛出
DocumentEvent
时,执行将通过您在那里的那些方法(
changedUpdate
insertUpdate
removeUpdate
)。

简短版本:

长版本:

首先,我要给你错误的解释。在此之后,我将提供一个适合您需要的特殊案例

这个错误意味着您的
DocumentListener
要么是一个抽象类,要么是一个接口(阅读这两个方面的内容,您就会明白了)

解决方案是查找它的子类(在EclipseIDE编辑器中选择类名时按CTRL+T),或者在实例化它的地方创建一个匿名类(参见下面的示例)。请记住,实例化接口通常不是一个好主意(除非您知道自己在做什么),即接口应该由单独的类实现,然后实例化这些类

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

知道了这一点,我们现在必须将所有这些具体化到您的代码中

将侦听器附加到不同元素(通常,侦听器是接口)时,代码标准是将侦听器作为匿名类直接添加为API参数,如下所示:

age.getDocument().addDocumentListener(new DocumentListener()
{
    // implement necessary methods here
});
立即告诉我您需要在那里实现哪些方法。最后,您的代码应该如下所示:

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);

通过以侦听器的身份编写
,这意味着当抛出
DocumentEvent
时,执行将通过您在那里的那些方法(
changedUpdate
insertUpdate
removeUpdate
).

正如您在TextFields类声明中看到的,您正在实现DocumentsTener,这意味着它是一个接口,您不能实例化接口。 用这个替换有问题的行

DocumentListener DL = new TextFields();
因为TextFields已经实现了DocumentListener接口,所以一切都会很好。
或者您可以为侦听器使用单独的类或内部类。

正如您在TextFields类声明中看到的,您正在实现DocumentsTener,这意味着这是一个接口,不能实例化接口。
age.getDocument().addDocumentListener(this);
用这个替换有问题的行

DocumentListener DL = new TextFields();
因为TextFields已经实现了DocumentListener接口,所以一切都会很好。 或者,您可以为侦听器使用单独的类或内部类

age.getDocument().addDocumentListener(this);