【问题标题】:Document Listener java "Cannot instantiate the type DocumentListener"文档侦听器 java“无法实例化类型 DocumentListener”
【发布时间】:2014-01-02 14:43:36
【问题描述】:

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

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

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

    }
}

由于我是初学者,我希望能得到不需要大量知识就能理解的简单答案。

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

【问题讨论】:

    标签: java swing jtextfield documentlistener


    【解决方案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写成监听器,意味着当DocumentEvents被抛出时,执行会通过你那里的那些方法(changedUpdate,insertUpdate,removeUpdate)。

    【讨论】:

      【解决方案2】:

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

      DocumentListener DL = new TextFields();
      

      既然 TextFields 已经实现了 DocumentListener 接口,一切都会好起来的。 或者,您可以为侦听器使用单独的或内部类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 2012-01-07
        • 2021-11-04
        • 2013-12-18
        • 1970-01-01
        • 2018-12-21
        相关资源
        最近更新 更多