我正在尝试编写一个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");
}
}下一个是主面板,其中包含另一个面板
public JPanelTRANSMISIONES() {
initComponents();
anadirPaneles();
}jPanelTASAS1 = new gestionTrafico.forms.JPanelTASAS();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就能工作。但是如果我改变面板中的文本字段的值,它不会改变。
发布于 2017-01-17 17:20:58
猜测:您的问题很简单,仅仅更改背景并不会自动触发受影响的UI元素的重绘。
换句话说:您可能会在标准输出上看到这些消息;但是为了更改UI,您应该在框架或面板上调用repaint()。
有关常见绘画问题的一些常见解决方案,请参见here。
但考虑到你的最新评论,你甚至还没有做到这一点。我猜您必须更仔细地研究使用DocumentListener的细节,例如,通过研究这个here。
发布于 2017-01-17 18:41:38
是的,绝对可以将文档侦听器添加到位于第二个面板内的面板上的文本字段的文档中。
您可能正在将侦听器添加到错误的文档和/或文本字段中;但很难说清楚您是如何操作的,这可能与面板的构造/添加方式有关……
示例(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构造函数,并将listener添加到容易出错的字段中!
发布于 2017-01-17 19:45:11
我知道答案了。
问题是我在构造函数中添加了DocumentListener,我更改了它,当textField获得焦点(txtTASAFocusGained)时,我调用getDocument().addDocumentListener。
现在它可以正常工作了。
https://stackoverflow.com/questions/41692990
复制相似问题