gpt4 book ai didi

java - 使用类属性的多个类似 DocumentListeners - 如何将它们压缩为一个监听器?

转载 作者:行者123 更新时间:2023-11-29 07:36:54 28 4
gpt4 key购买 nike

我有一个类 TestListeners,其中包含一些 JTextFields 和其他属性(此处为整数)。我希望属性在相应的 JTextField 文本更改时更新。因此,我添加了一些 DocumentListeners,但这些监听器做的事情几乎完全相同,只是目标属性不同。目标是只有一个可以添加到所有三个 JTextField 的监听器,并且应该为每个 JTextField 处理相应的类属性。

我发现了以下问题,它帮助我将 JTextField 动态地放入监听器中,而不必在其中进行硬编码:

https://codereview.stackexchange.com/questions/25895/applying-documentlistener-on-multiple-jtextfield

但是我找不到在监听器中动态引用应该更改的属性的方法。如果有人能帮助找到方法,我会很高兴。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TestListeners extends JFrame {
Color white = new Color(255, 255, 255);
Color red = new Color(255, 200, 200);
JTextField field1 = new JTextField("11111");
JTextField field2 = new JTextField("22222");
JTextField field3 = new JTextField("33333");
int value1 = 0;
int value2 = 0;
int value3 = 0;

public static void main(String[] args) {
new TestListeners();
}

public TestListeners() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(new Dimension(150, 100));
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

c.gridx++; this.add(field1, c);
c.gridx++; this.add(field2, c);
c.gridx++; this.add(field3, c);

field1.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
filterText(field1.getText());
}

@Override
public void insertUpdate(DocumentEvent e) {
filterText(field1.getText());
}

@Override
public void changedUpdate(DocumentEvent e) {
filterText(field1.getText());
}

private void filterText(String text) {
try {
value1 = Integer.parseInt(text);
field1.setBackground(white);
System.out.println("value1 = " + value1);
} catch (NumberFormatException ex) {
System.out.println("text in field1 is not an integer");
field1.setBackground(red);
}
}
});

field2.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
filterText(field2.getText());
}

@Override
public void insertUpdate(DocumentEvent e) {
filterText(field2.getText());
}

@Override
public void changedUpdate(DocumentEvent e) {
filterText(field2.getText());
}

private void filterText(String text) {
try {
value2 = Integer.parseInt(text);
field2.setBackground(white);
System.out.println("value2 = " + value2);
} catch (NumberFormatException ex) {
System.out.println("text in field2 is not an integer");
field2.setBackground(red);
}
}
});

field3.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
filterText(field3.getText());
}

@Override
public void insertUpdate(DocumentEvent e) {
filterText(field3.getText());
}

@Override
public void changedUpdate(DocumentEvent e) {
filterText(field3.getText());
}

private void filterText(String text) {
try {
value3 = Integer.parseInt(text);
field3.setBackground(white);
System.out.println("value3 = " + value3);
} catch (NumberFormatException ex) {
System.out.println("text in field3 is not an integer");
field3.setBackground(red);
}
}
});

this.setVisible(true);
}
}

最佳答案

您正在使用匿名类来实现您的 DocumentListner

你当然可以创建一个新类

public class MyDocumentListener implements DocumentListner {

public MyDocumentListener (TestListeners parentFrame) {
// either via getter or in your example:

parentFrame.value3 = 123; // value3 is packed protected.
}
// copy paste your methods here.
}

您必须将对要更改的 GUI 项的引用传递给 MyDocumentListener 的新实例。

请注意,您的成员变量没有任何修饰符。因此这个成员是数据包保护的。只要您的新类与 TestListeners 相同,您就可以在没有 getter 的情况下访问它们。否则为此值实现 getter 和 setter。

您可以通过实现适当的构造函数来做到这一点。

然后您可以像这样添加 DocumentListner:

field3.getDocument().addDocumentListener(new MyDocumentListner(this));

我们必须将“this”传递给 MyDocumentListner 的新实例,以便新的监听器能够访问其中的字段。


或者您可以创建一个由您的匿名类组成的对象:

DocumentListner myListener = new DoucmentListener {
// implement your methods here
}

然后您可以像这样将 DocumentListener 传递给您的字段:

field3.getDocument().addDocumentListener(myListener);

关于java - 使用类属性的多个类似 DocumentListeners - 如何将它们压缩为一个监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582636/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com