我试图为一个项目写一个简单的退休计算器。
我试图获取文档侦听器,以便从不同的文本字段中获取输入并在计算中使用它们。
出于某种原因,我无法让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
}
}
由于我开始编程,我会很感激简单的答案,这些答案不需要大量的知识才能理解。
非常感谢您的时间和帮助! 罗伊。
答案 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
时,执行将通过您的那些方法(changedUpdate
,insertUpdate
,{ {1}})。
答案 1 :(得分:0)
正如您在TextFields类声明中所看到的,您正在实现DocumentLstener,这意味着它是一个接口,您无法实例化接口。 用这个
替换有问题的行DocumentListener DL = new TextFields();
由于TextFields已经实现了DocumentListener接口,所以一切都会好的。 或者你可以为监听器使用单独的或内部的类。