Java 文档侦听器工作不正常
我试图编写一个DocumentListener,以便将更改捕获到文本字段中 我有一个面板,其中包括另一个面板,我在其中放置了一个文本字段,我尝试了很多公式,但都不起作用 这是专家组Java 文档侦听器工作不正常,java,swing,jpanel,jtextfield,documentlistener,Java,Swing,Jpanel,Jtextfield,Documentlistener,我试图编写一个DocumentListener,以便将更改捕获到文本字段中 我有一个面板,其中包括另一个面板,我在其中放置了一个文本字段,我尝试了很多公式,但都不起作用 这是专家组 public JPanelTASAS() { initComponents(); txtTASA.getDocument().addDocumentListener(new BecomingYellowDocumentListener(txtTASA)); } private static clas
public JPanelTASAS() {
initComponents();
txtTASA.getDocument().addDocumentListener(new BecomingYellowDocumentListener(txtTASA));
}
private static class BecomingYellowDocumentListener implements DocumentListener {
private utilesGUIx.JTextFieldCZ textField;
public BecomingYellowDocumentListener(utilesGUIx.JTextFieldCZ textField) {
this.textField = textField;
}
@Override
public void insertUpdate(DocumentEvent e) {
textField.setBackground(Color.yellow);
System.out.println("Prueba");
}
@Override
public void removeUpdate(DocumentEvent e) {
textField.setBackground(Color.yellow);
System.out.println("Prueba");
}
@Override
public void changedUpdate(DocumentEvent e) {
textField.setBackground(Color.yellow);
System.out.println("Prueba");
}
}
下一个是主面板,其中包括另一个面板
public JPanelTRANSMISIONES() {
initComponents();
anadirPaneles();
}
在initComponents中使用此代码
jPanelTASAS1 = new gestionTrafico.forms.JPanelTASAS();
记录代码为utilesGUIx.JTextFieldCZ
public JTextFieldCZ() {
super();
enableEvents(AWTEvent.FOCUS_EVENT_MASK);
enableEvents(AWTEvent.KEY_EVENT_MASK);
setDocument(createDefaultModel());
}
public void setDocument(Document doc) {
if (doc != null) {
doc.putProperty("filterNewlines", Boolean.TRUE);
}
super.setDocument(doc);
}
需要明确的是,如果将此侦听器应用于主面板的JTextField,那么问题在于将文档侦听器添加到另一个面板中的面板。可能吗 事先非常感谢您的帮助 编辑:我意识到如果我更改文本字段硬编码的值,documentlistener就会工作。但是,如果我在面板中更改textfield的值,它不会更改 猜测:您的问题很简单,仅仅更改背景并不会自动触发受影响UI元素的重新绘制 换句话说:您可能会在stdout上看到这些消息;但是为了让UI发生变化,您应该在框架或面板上调用
repaint()
有关常见喷漆问题的一些常见解决方案,请参阅
但考虑到你最近的评论,你甚至还没有做到。我想您必须更仔细地研究使用DocumentListener的细节,例如通过研究这一点。是的,完全可以将DocumentListener添加到位于第二个面板内的文本字段的文档中 您可能正在将侦听器添加到错误的文档和/或文本字段;但是很难说不知道你是怎么做的,可能与面板的构造/添加有关 示例(SSCC),quick&dirty只是为了说明这是可能的:
package test;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class Panels {
public static void main(String[] args) {
new Panels();
}
private JFrame frame;
private JPanel firstPanel;
private JPanel secondPanel;
private Panels() {
initGUI();
frame.setVisible(true);
}
private void initGUI() {
JTextField secondField = new JTextField(20);
secondField.getDocument().addDocumentListener(new ColoringListener(secondField));
secondPanel = new JPanel();
secondPanel.setBorder(new TitledBorder("Second"));
secondPanel.add(secondField);
JTextField firstField = new JTextField(20);
firstField.getDocument().addDocumentListener(new ColoringListener(firstField));
firstPanel = new JPanel();
firstPanel.setBorder(new TitledBorder("First"));
firstPanel.add(firstField);
firstPanel.add(secondPanel);
frame = new JFrame();
frame.add(firstPanel);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
}
private static class ColoringListener implements DocumentListener {
private final JTextField field;
ColoringListener(JTextField field) {
this.field = field;
}
@Override
public void insertUpdate(DocumentEvent e) {
field.setBackground(Color.GREEN);
}
@Override
public void removeUpdate(DocumentEvent e) {
field.setBackground(Color.RED);
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}
}
编辑:我尝试使用与问题中相同的结构。我不希望必须将字段传递给listeners构造函数,并将侦听器添加到字段中——这很容易出错 我得到了答案
问题是,我正在构造函数中添加DocumentListener,我对其进行了更改,并在textField获得焦点时调用getDocument().addDocumentListener(txttasafocus)
现在它可以正常工作。为了更快地获得更好的帮助,请发布一个or。我认为这个示例非常清楚,我如何改进它?对于初学者,您可以仔细阅读这两个文档,向面板添加文档监听器?向面板的文本字段添加文档监听器可能是颜色问题,但我在输出中看不到System.out.println,就像DocumentListener工作得不太好一样。那我们真的有问题了,;因为你的输入代码看起来是正确的;但另一方面,它确实令人困惑;从这个意义上说:我们真的需要您提供一个真实的消息—我们可以立即编译并运行自己的消息。需要明确的是,如果将此侦听器应用到主面板的JTextField,它就会工作,我认为问题在于将文档侦听器添加到另一个面板中的面板。可能吗?我感谢您的帮助@GhostCatIt自从我与DocumentListener合作以来已经有一段时间了。从这个意义上说,你可能想退一步,A)真正理解整个概念(我在答案中添加了另一个链接)B)决定你是否真的需要一个DocumentListener。你看,只有当你从使用中获得一些东西时,听者才有“真正”的意义;例如,当使用您自己的文档模型时,我认为由于您的代码,我已经接近真正的问题,我意识到如果我更改textfield硬编码的值,documentlistener就会工作。但是,如果我在面板中更改textfield的值,它不会更改。