gpt4 book ai didi

java - PropertyChangeListener requestFocus 问题

转载 作者:行者123 更新时间:2023-11-29 03:22:27 27 4
gpt4 key购买 nike

全新方向

以下是我的问题的 SSCCE。我试图在输入输入时更新字段,在这种情况下,必须失去焦点才能进行更新。

package test;
import java.awt.EventQueue;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.NumberFormatter;

public class Test {

private JFormattedTextField input, input2;
private NumberFormatter formatter;
private DocumentListener listener;

public Test() {
formatter = new NumberFormatter(NumberFormat.getNumberInstance());
input = new JFormattedTextField(formatter);
input2 = new JFormattedTextField(formatter);

listener = new DocumentListener() {

private Document source = null;

protected void update(Document doc) {
if (source == null) {
System.out.println("Update");
source = doc;
if (source.equals(input.getDocument())) {
double temp;
temp = converter(((Number)input.getValue()).doubleValue());
input2.setValue(temp);
// input2.setText(Double.toString(temp));
} else if (source.equals(input2.getDocument())) {
double temp;
temp = converterBack(((Number)input2.getValue()).doubleValue());
input.setValue(temp);
// input.setText(Double.toString(temp));
}
source = null;
}
}

@Override
public void insertUpdate(DocumentEvent e) {
update(e.getDocument());
}

@Override
public void removeUpdate(DocumentEvent e) {
update(e.getDocument());
}

@Override
public void changedUpdate(DocumentEvent e) {
update(e.getDocument());
}
};

input.getDocument().addDocumentListener(listener);
input2.getDocument().addDocumentListener(listener);
input.setColumns(4);
input2.setColumns(4);
input.setValue(0.0);
JPanel panel = new JPanel();
panel.add(input);
panel.add(input2);

JOptionPane.showMessageDialog(null, panel);
}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {
public void run() {
new Test();
}
});

}

private double converter(double value) {
value = value * 2;

return value;
}
private double converterBack(double value){
value = value/2;

return value;
}
}

我需要能够将此代码与“转换器”方法 一起使用,因此无法将命令放入方法 Update() 中。

我已经让它与 PropertyChangeListener 一起工作,但显然这不是一个好的途径。

最佳答案

PropertyChangeListener 不会解决这个问题,因为该字段的 Document 不会引发事件...Document是字段的属性,但它的内容不是。

更好的解决方案是使用 DocumentListener。这将在基础文档内容发生更改时发出通知。

你需要小心这一点,因为 Document 不喜欢在它已经发生变化时被改变。

在此示例中,我使用事件的源 Document 并将其与每个字段 Document 进行比较以确定应更新的内容...

Example

import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.NumberFormatter;

public class Test {

private JFormattedTextField input, input2;
private NumberFormatter formatter;
// private PropertyChangeListener listener;
private DocumentListener listener;

public Test() {
formatter = new NumberFormatter(NumberFormat.getNumberInstance());
input = new JFormattedTextField(formatter);
input2 = new JFormattedTextField(formatter);

listener = new DocumentListener() {

private Document source = null;

protected void update(Document doc) {
if (source == null) {
System.out.println("Update");
source = doc;
if (source.equals(input.getDocument())) {
input2.setText(input.getText());
} else if (source.equals(input2.getDocument())) {
input.setText(input2.getText());
}
source = null;
}
}

@Override
public void insertUpdate(DocumentEvent e) {
update(e.getDocument());
}

@Override
public void removeUpdate(DocumentEvent e) {
update(e.getDocument());
}

@Override
public void changedUpdate(DocumentEvent e) {
update(e.getDocument());
}
};
// listener = new PropertyChangeListener() {
// @Override
// public void propertyChange(PropertyChangeEvent evt) {
// convert(evt);
// }
// };

input.getDocument().addDocumentListener(listener);
input2.getDocument().addDocumentListener(listener);

input.setColumns(4);
input2.setColumns(4);
// input.addPropertyChangeListener("value", listener);
// input2.addPropertyChangeListener("value", listener);
input.setValue(0.0);
JPanel panel = new JPanel();
panel.add(input);
panel.add(input2);

JOptionPane.showMessageDialog(null, panel);
}

private void convert(PropertyChangeEvent evt) {
if (evt.getSource() == input) {
if (evt.getSource() != null) {
double temp;
temp = converter((Double) evt.getNewValue());
input2.setValue(temp);
}

}

}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {
public void run() {
new Test();
}
});

}

private double converter(double value) {
value = value * 2;

return value;
}

}

已更新

您在转换时遇到的问题是该值尚未“提交”,这意味着它尚未经过验证并且 value 属性尚未更改。

调用 getValue 将返回最后提交的值。

您需要做的是先提交编辑...

if (source.equals(input.getDocument())) {
try {
input.commitEdit();
double temp = ((Number) input.getValue()).doubleValue();
temp = converter(temp);
input2.setValue(temp);
} catch (ParseException ex) {
}

关于java - PropertyChangeListener requestFocus 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799258/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com