Java jFormattedTextField';s Formatter.setCommitsonValidIt(true)不';我一开始不工作
我有一个Java jFormattedTextField';s Formatter.setCommitsonValidIt(true)不';我一开始不工作,java,swing,event-listener,propertychanged,jformattedtextfield,Java,Swing,Event Listener,Propertychanged,Jformattedtextfield,我有一个jFormattedTextField,我将setcommitsonvalidit设置为true,然后在“value”属性的“property change”中添加了一个事件侦听器 在该jFormattedTextField的第一个焦点处,它在键入时不调用事件侦听器方法。但在“focusLost”中,它调用事件监听器,然后当它再次收到焦点时,在键入时调用事件监听器 我希望在jFormattedTextField中的任何时间发生任何更改后调用事件侦听器(即使在第一个焦点中) 有什么问题吗?
jFormattedTextField
,我将setcommitsonvalidit
设置为true,然后在“value”属性的“property change”中添加了一个事件侦听器
在该jFormattedTextField
的第一个焦点处,它在键入时不调用事件侦听器方法。但在“focusLost”中,它调用事件监听器,然后当它再次收到焦点时,在键入时调用事件监听器
我希望在jFormattedTextField
中的任何时间发生任何更改后调用事件侦听器(即使在第一个焦点中)
有什么问题吗?如何修复它?您可能需要查看示例 编辑: 我第一次接触
JFormattedTextField
,就知道了这个问题,下面是一个在第一次接触focusLost
:-)时不起作用的示例,可能已经演示了您的问题
两个JFormattedTextField
的最小限制都设置为10.000,-
第一JFormattedTextField
处理FocusListener
(输出必须延迟到invokeLater
)
第二JFormattedTextField
处理DocumentListener
(每…)工作一次
初始外观
这是同样的问题,因为我在这里只放了500,-在焦点上没有改变,正确的数量必须是>=10.000,-
在2dn上<代码>焦点丢失有效
不知道这是怎么可能的,但通过包装到invokeLater()
,解决了这个问题,然后在1号开始工作<代码>焦点丢失(必须取消对这些代码行的注释)
源代码
import java.awt.*;
import java.awt.event.*;
import java.math.RoundingMode;
import java.text.NumberFormat;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
public class FormatterLimit {
private JFrame frame = new JFrame();
private JPanel pnl = new JPanel();
private JLabel focusLabel = new JLabel(" focusLost Handle ");
private JFormattedTextField formTextField;
private JLabel docLabel = new JLabel(" document Handle ");
private JFormattedTextField formTextField1;
private NumberFormat formTextFieldFormat;
private double amount = 10000.00;
public FormatterLimit() {
formTextFieldFormat = NumberFormat.getNumberInstance();
formTextFieldFormat.setMinimumFractionDigits(2);
formTextFieldFormat.setMaximumFractionDigits(2);
formTextFieldFormat.setRoundingMode(RoundingMode.HALF_UP);
focusLabel.setFont(new Font("Serif", Font.BOLD, 14));
focusLabel.setForeground(Color.blue);
focusLabel.setPreferredSize(new Dimension(120, 27));
formTextField = new JFormattedTextField(formTextFieldFormat);
formTextField.setValue(amount);
formTextField.setFont(new Font("Serif", Font.BOLD, 22));
formTextField.setForeground(Color.black);
formTextField.setBackground(Color.yellow);
formTextField.setPreferredSize(new Dimension(120, 27));
formTextField.setHorizontalAlignment(SwingConstants.RIGHT);
formTextField.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
formTextField.requestFocus();
formTextField.setText(formTextField.getText());
formTextField.selectAll();
}
@Override
public void focusLost(FocusEvent e) {
//Runnable doRun = new Runnable() {
//@Override
//public void run() {
double t1a1 = (((Number) formTextField.getValue()).doubleValue());
if (t1a1 < 1000) {
formTextField.setValue(amount);
}
//}
// };
//SwingUtilities.invokeLater(doRun);
}
});
docLabel.setFont(new Font("Serif", Font.BOLD, 14));
docLabel.setForeground(Color.blue);
docLabel.setPreferredSize(new Dimension(120, 27));
formTextField1 = new JFormattedTextField(formTextFieldFormat);
formTextField1.setValue(amount);
formTextField1.setFont(new Font("Serif", Font.BOLD, 22));
formTextField1.setForeground(Color.black);
formTextField1.setBackground(Color.yellow);
formTextField1.setPreferredSize(new Dimension(120, 27));
formTextField1.setHorizontalAlignment(SwingConstants.RIGHT);
formTextField1.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
formTextField1.requestFocus();
formTextField1.setText(formTextField1.getText());
formTextField1.selectAll();
}
@Override
public void focusLost(FocusEvent e) {
}
});
formTextField1.getDocument().addDocumentListener(docListener);
pnl = new JPanel();
pnl.setBorder(new EmptyBorder(2, 2, 2, 2));
pnl.setLayout(new GridLayout(2, 2));
pnl.add(focusLabel);
pnl.add(formTextField);
pnl.add(docLabel);
pnl.add(formTextField1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pnl, BorderLayout.CENTER);
frame.setLocation(200, 200);
frame.pack();
frame.setVisible(true);
formTextFieldFocus1();
}
//
private DocumentListener docListener = new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
@Override
public void insertUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
@Override
public void removeUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
private void printIt(DocumentEvent documentEvent) {
DocumentEvent.EventType type = documentEvent.getType();
double t1a1 = (((Number) formTextField1.getValue()).doubleValue());
if (t1a1 < 1000) {
Runnable doRun = new Runnable() {
@Override
public void run() {
formTextField1.setValue(amount);
}
};
SwingUtilities.invokeLater(doRun);
}
}
};
private void formTextFieldFocus1() {
Runnable doRun = new Runnable() {
@Override
public void run() {
formTextField1.grabFocus();
formTextField1.requestFocus();
formTextField1.setText(formTextField1.getText());
formTextField1.selectAll();
}
};
SwingUtilities.invokeLater(doRun);
}
private void formTextFieldFocus() {
Runnable doRun = new Runnable() {
@Override
public void run() {
formTextField.grabFocus();
formTextField.requestFocus();
formTextField.setText(formTextField.getText());
formTextField.selectAll();
formTextFieldFocus1();
}
};
SwingUtilities.invokeLater(doRun);
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
FormatterLimit fl = new FormatterLimit();
}
});
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.math.RoundingMode;
导入java.text.NumberFormat;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.event.*;
公共类格式化程序限制{
私有JFrame=新JFrame();
private JPanel pnl=new JPanel();
专用JLabel focusLabel=新JLabel(“focusLost句柄”);
私有JFormattedTextField formTextField;
私有JLabel docLabel=新JLabel(“文档句柄”);
私有JFormattedTextFieldFormTextField1;
私有数字格式formTextFieldFormat;
私人双倍金额=10000.00;
公共格式化程序限制(){
formTextFieldFormat=NumberFormat.getNumberInstance();
formTextFieldFormat.setMinimumFractionDigits(2);
formTextFieldFormat.setMaximumFractionDigits(2);
formTextFieldFormat.setRoundingMode(RoundingMode.HALF_UP);
setFont(新字体(“衬线”,Font.BOLD,14));
focusLabel.setForeground(颜色:蓝色);
focusLabel.setPreferredSize(新尺寸(120,27));
formTextField=新的JFormattedTextField(formTextFieldFormat);
formTextField.setValue(金额);
setFont(新字体(“衬线”,Font.BOLD,22));
formTextField.setForeground(颜色为黑色);
formTextField.setBackground(颜色:黄色);
setPreferredSize(新维度(120,27));
formTextField.setHorizontalAlignment(SwingConstants.RIGHT);
addFocusListener(新FocusListener()){
@凌驾
获得公共无效焦点(焦点事件e){
formTextField.requestFocus();
formTextField.setText(formTextField.getText());
formTextField.selectAll();
}
@凌驾
公共无效焦点丢失(焦点事件e){
//Runnable doRun=new Runnable(){
//@凌驾
//公开募捐{
double t1a1=((数字)formTextField.getValue()).doubleValue());
如果(t1a1<1000){
formTextField.setValue(金额);
}
//}
// };
//SwingUtilities.invokeLater(多伦);
}
});
docLabel.setFont(新字体(“衬线”,Font.BOLD,14));
docLabel.setForeground(颜色:蓝色);
docLabel.setPreferredSize(新尺寸(120,27));
formTextField1=新的JFormattedTextField(formTextFieldFormat);
formTextField1.设置值(金额);
formTextField1.setFont(新字体(“衬线”,Font.BOLD,22));
formTextField1.设置前景(颜色为黑色);
formTextField1.挫折背景(颜色:黄色);
formTextField1.setPreferredSize(新维度(120,27));
formTextField1.设置水平对齐(SwingConstants.右);
formTextField1.addFocusListener(新FocusListener(){
@凌驾
获得公共无效焦点(焦点事件e){
formTextField1.requestFocus();
formTextField1.setText(formTextField1.getText());
formTextField1.selectAll();
}
@凌驾
公共无效焦点丢失(焦点事件e){
}
});
formTextField1.getDocument().addDocumentListener(docListener);
pnl=新的JPanel();
pnl.setboorder(新的空订单(2,2,2,2));
pnl.setLayout(新网格布局(2,2));
pnl.add(焦点标签);
pnl.add(formTextField);
pnl.add(docLabel);
pnl.add(formTextField1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pnl,BorderLayout.CENTER);
帧设置位置(200200);
frame.pack();
frame.setVisible(true);
formTextFieldFocus1();
}
//
私有DocumentListener docListener=新DocumentListener(){
@凌驾
public void changedUpdate(DocumentEvent DocumentEvent){
printIt(documentEvent);
}
@凌驾
公共作废插入更新(DocumentEvent DocumentEvent){
printIt(documentEvent);
}
@凌驾
公共作废移除更新(DocumentEvent DocumentEvent){
printIt(documentEvent);
}
私人无效原则
NumberFormatter numberFormatter = new NumberFormatter(
NumberFormat.getIntegerInstance());
// allow or not doesn't make a difference
numberFormatter.setAllowsInvalid(false);
numberFormatter.setCommitsOnValidEdit(true);
JFormattedTextField readTimeOut = new JFormattedTextField(numberFormatter);
PropertyChangeListener l = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
LOG.info("got new value: " + evt.getNewValue());
}
};
readTimeOut.addPropertyChangeListener("value", l);
readTimeOut.setColumns(20);
readTimeOut.setHorizontalAlignment(SwingConstants.RIGHT);
JFormattedTextField other = new JFormattedTextField(numberFormatter);
other.addPropertyChangeListener("value", l);
other.setColumns(20);
other.setHorizontalAlignment(SwingConstants.RIGHT);
JPanel box = new JPanel();
box.add(readTimeOut);
box.add(other);