Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文档侦听器工作不正常_Java_Swing_Jpanel_Jtextfield_Documentlistener - Fatal编程技术网

Java 文档侦听器工作不正常

Java 文档侦听器工作不正常,java,swing,jpanel,jtextfield,documentlistener,Java,Swing,Jpanel,Jtextfield,Documentlistener,我试图编写一个DocumentListener,以便将更改捕获到文本字段中 我有一个面板,其中包括另一个面板,我在其中放置了一个文本字段,我尝试了很多公式,但都不起作用 这是专家组 public JPanelTASAS() { initComponents(); txtTASA.getDocument().addDocumentListener(new BecomingYellowDocumentListener(txtTASA)); } private static clas

我试图编写一个DocumentListener,以便将更改捕获到文本字段中

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

这是专家组

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的值,它不会更改。