DocumentListener无法正常工作

时间:2017-01-17 09:07:55

标签: java swing jpanel jtextfield documentlistener

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

我有一个面板,其中包含另一个面板,其中我放了一个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");
    }
}

下一个是主要的Panel,其中包含其他面板

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);
    }

为了清楚起见,如果将此侦听器应用于Principal Panel的JTextField它是否有效,我认为问题是将文档侦听器添加到另一个面板内的面板。有可能吗?

非常感谢您的帮助

编辑:我认为如果我改变文本字段硬编码的值,则documentlistener可以工作。但是,如果我更改面板中文本字段的值,它不会。

3 个答案:

答案 0 :(得分:1)

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

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

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

但鉴于你的最新评论,你还没有。我想你必须仔细研究使用DocumentListener的细节,例如研究这个here

答案 1 :(得分:1)

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

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

示例(SSCC),快速和肮脏只是为了表明它是可能的:

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) {
        }
    }
}

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

答案 2 :(得分:0)

我得到了答案。

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

现在它正常运作。