[英]PropertyChangeListener requestFocus issue
以下是我的問題的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;
}
}
我需要能夠通過'converter' method
使用此代碼,因此不能將命令放入method Update()
中。
我已經將其與PropertyChangeListener
但是顯然這不是一個好方法。
PropertyChangeListener
無法解決此問題,因為該字段的Document
不會引發事件...該Document
是該字段的屬性,但其內容不是。
更好的解決方案是使用DocumentListener
。 這將在基礎文檔內容更改時通知。
您需要注意這一點,因為Document
在進行更改時不喜歡更改。
在此示例中,我使用事件的源Document
並將其與每個字段Document
進行比較以確定應更新的內容...
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) {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.