Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jFormattedTextField';s Formatter.setCommitsonValidIt(true)不';我一开始不工作_Java_Swing_Event Listener_Propertychanged_Jformattedtextfield - Fatal编程技术网

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);