DocumentListener 无法正常工作

Posted

技术标签:

【中文标题】DocumentListener 无法正常工作【英文标题】:DocumentListener not working properly 【发布时间】:2017-06-01 06:30:57 【问题描述】:

我试图编写一个 DocumentListener 以便将更改捕获到一个 textField 中。

我有一个面板,其中包括另一个面板,我在其中放置了一个文本字段,我尝试了很多公式,但都不起作用

这是面板

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 它可以工作,我认为问题在于将文档侦听器添加到另一个面板内的面板。有可能吗?

非常感谢您的帮助

编辑:我意识到如果我更改文本字段硬编码的值,则文档侦听器可以工作。但是,如果我更改面板中文本字段的值,它不会。

【问题讨论】:

如需尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。 我觉得这个例子很清楚,我该如何改进呢? 对于初学者,你可以仔细阅读这两个文件,并询问任何你不明白的地方。 向面板添加文档侦听器? 向 Panel 的 textField 添加文档侦听器 【参考方案1】:

我得到了答案。

问题是我在构造函数中添加了 DocumentListener,我更改它并在 textField 获得焦点时调用 getDocument().addDocumentListener (txtTASAFocusGained)。

现在它可以正常工作了。

【讨论】:

【参考方案2】:

是的,绝对可以将文档侦听器添加到位于第二个面板内的面板上的文本字段文档。

您可能将侦听器添加到错误的文档和/或文本字段;但很难说没有看到你是怎么做的,可能与面板的构造/添加方式有关......

示例(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) 
        
    

编辑:我尝试使用与问题中相同的结构。我不喜欢将字段传递给侦听器构造函数并将侦听器添加到字段 - 容易出错!

【讨论】:

感谢您的代码,我认为我正在接近真正的问题,我意识到如果我更改文本字段硬编码的值,则文档侦听器可以工作。但是,如果我更改面板中文本字段的值,它不会。【参考方案3】:

猜测:您的问题只是改变背景不会自动触发受影响的 UI 元素的重绘

换句话说:您可能会在标准输出上看到这些消息;但为了让您的 UI 发生变化,您应该在框架或面板上调用 repaint()

请参阅here,了解常见绘画问题的一些常见解决方案。

但是鉴于您最近的评论,您甚至还没有到达那里。我想你必须更仔细地研究使用 DocumentListener 的细节,例如通过研究这个here。

【讨论】:

也许这是颜色问题,但我在输出中看不到 System.out.println,就像 DocumentListener 不起作用 太糟糕了。那我们就真的有问题了;因为您的输入代码看起来是正确的;但另一方面确实令人困惑;从这个意义上说:我们真的需要你的 true minimal reproducible example - 我们可以立即编译和运行自己的东西。 为了清楚起见,如果将此侦听器应用于主面板的 JTextField 它可以工作,我认为问题在于将文档侦听器添加到另一个面板内的面板。可能吗 ?感谢您的帮助@GhostCat 我已经有一段时间没有使用 DocumentListener 了。从这个意义上说,您可能想退后一步,并且 A)真正理解整个概念(我在答案中添加了另一个链接) B)决定您是否真的需要 DocumentListener。你看,只有当你从使用它中获得一些东西时,那个听众才“真正”有意义。例如,在使用您自己的文档模型时。

以上是关于DocumentListener 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

将 macOS 更新到 Catalina 后,Play 框架无法正常工作

如何知道啥 JTextField 进入 DocumentListener

使用 DocumentListener 实现检查 JTextField

JTextArea DocumentListener 问题

DocumentListener 没有调用 insertUpdate 方法

从 DocumentListener 获取更改的文本