问题描述
我有一个 jFormattedTextField
,我将 setCommitsOnValidEdit
设置为true然后我为属性更改添加了一个事件监听器关于value属性。
I have a jFormattedTextField
and I set setCommitsOnValidEdit
to true then I added an event listener to "property change" on "value" property.
首先关注 jFormattedTextField
它在输入时不调用事件监听器方法在里面。但是在focusLost上它会调用事件监听器,之后当它再次获得焦点时,它会在输入时调用事件监听器。
At first focus of that jFormattedTextField
it doesn't call event listener method when typing in it. But on "focusLost" it calls event listener and after that when it receives focus again it calls event listener when typing.
我希望在任何更改后调用事件监听器任何时候在 jFormattedTextField
(即使在第一个焦点)。
I want the event listener be called after any change in any time in that jFormattedTextField
(Even in the fist focus).
有什么问题?我该如何解决?
What's the problem? How can I fix it?
推荐答案
可能你必须看看示例
编辑:
我知道我的第一次触摸 JFormattedTextField
这个问题,这里的例子不适用于firts focusLost
:-)和可能证明了你的问题
I know this issue from my 1st touch of JFormattedTextField
, here comings example that isn't works at firts focusLost
:-) and probably demonstrated your issue
10.000, -
的最低限额为 JFormattedTextField设置
,
1st。 JFormattedTextField
处理 FocusListener
(输出必须延迟到 invokeLater
)
1st. JFormattedTextField
handling FocusListener
(output must be delayed into invokeLater
)
第二名。 JFormattedTextField
处理 DocumentListener
(每个工作......)
2nd. JFormattedTextField
handling DocumentListener
(works every...)
初始看
这里也是同样的问题,因为我这里只放了500,而且在focusLost上没有任何改变,正确的金额必须是> = 10.000, -
here is same problem, because I put here only 500,- and on focusLost nothing changed, correct amount must be >= 10.000,-
。 focusLost
有效....
不知道怎么可能,但通过包装到 invokeLater()解决了
,然后在1日工作。 focusLost
(您必须取消注释这些代码行)
no idea how is that possible, but solved by wrapping into invokeLater()
, then works on 1st. focusLost
(you have to uncomment these code lines)
代码
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();
}
});
}
}
这篇关于jFormattedTextField的Formatter.setCommitsOnValidEdit(true)在第一次焦点时不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!