首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DocumentListener不能正常工作

DocumentListener不能正常工作
EN

Stack Overflow用户
提问于 2017-01-17 17:07:55
回答 3查看 1.1K关注 0票数 1

我正在尝试编写一个DocumentListener,以便将更改捕获到textField中。

我有一个面板,其中包括另一个面板,其中我放了一个textField,我尝试了很多公式,但它不起作用

代码语言:javascript
复制
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");
    }
}

下一个是主面板,其中包含另一个面板

代码语言:javascript
复制
public JPanelTRANSMISIONES() {
    initComponents();
    anadirPaneles();
}

代码语言:javascript
复制
jPanelTASAS1 = new gestionTrafico.forms.JPanelTASAS();

代码语言:javascript
复制
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就能工作。但是如果我改变面板中的文本字段的值,它不会改变。

EN

回答 3

Stack Overflow用户

发布于 2017-01-17 17:20:58

猜测:您的问题很简单,仅仅更改背景并不会自动触发受影响的UI元素的重绘

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

有关常见绘画问题的一些常见解决方案,请参见here

但考虑到你的最新评论,你甚至还没有做到这一点。我猜您必须更仔细地研究使用DocumentListener的细节,例如,通过研究这个here

票数 1
EN

Stack Overflow用户

发布于 2017-01-17 18:41:38

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

您可能正在将侦听器添加到错误的文档和/或文本字段中;但很难说清楚您是如何操作的,这可能与面板的构造/添加方式有关……

示例(SSCC),quick&dirty只是为了说明它是可能的:

代码语言:javascript
复制
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构造函数,并将listener添加到容易出错的字段中!

票数 1
EN

Stack Overflow用户

发布于 2017-01-17 19:45:11

我知道答案了。

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

现在它可以正常工作了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41692990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档