Document Listener java“无法实例化DocumentListener类型”

时间:2013-12-15 00:58:17

标签: java swing jtextfield 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

    }
}

由于我开始编程,我会很感激简单的答案,这些答案不需要大量的知识才能理解。

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

2 个答案:

答案 0 :(得分:1)

简短版本:

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

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

长版:

首先,我要给你错误说明。在那之后,我将包括一个适合您需求的特定案例。

该错误意味着您的DocumentListener要么是抽象类,要么是界面(阅读这两个,然后您就会明白这一点)。

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

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

了解这一点,我们现在必须将所有这些特别化为您的代码。

将侦听器附加到不同的元素(通常,侦听器是接口)时,代码标准是将侦听器直接添加为匿名类作为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时,执行将通过您的那些方法(changedUpdateinsertUpdate,{ {1}})。

答案 1 :(得分:0)

正如您在TextFields类声明中所看到的,您正在实现DocumentLstener,这意味着它是一个接口,您无法实例化接口。 用这个

替换有问题的行
DocumentListener DL = new TextFields();

由于TextFields已经实现了DocumentListener接口,所以一切都会好的。 或者你可以为监听器使用单独的或内部的类。