【问题标题】:jFormattedTextField's Formatter.setCommitsOnValidEdit(true) doesn't work at first focusjFormattedTextField 的 Formatter.setCommitsOnValidEdit(true) 在第一次关注时不起作用
【发布时间】:2011-11-09 03:30:11
【问题描述】:

我有一个jFormattedTextField 并将setCommitsOnValidEdit 设置为true,然后我在“值”属性的“属性更改”中添加了一个事件侦听器。

jFormattedTextField 的第一个焦点在输入时不会调用事件侦听器方法。但是在“focusLost”上它会调用事件监听器,然后当它再次获得焦点时它会在输入时调用事件监听器。

我希望在 jFormattedTextField 的任何时间发生任何变化后调用事件侦听器(即使在第一个焦点中)。

有什么问题?我该如何解决?

【问题讨论】:

  • 你在说什么技术?
  • J2SE 的 Swing 中的 jFormattedTextField
  • 什么是setCommitsOnValidEdit
  • 嗨;对不起,我的意思是jFormattedTextField's Formatter.setCommitsOnValidEdit
  • 会建议您跟踪为什么 commitOnValid 不能按预期工作,而不是添加大量的 hack-around 代码,这会在未来的某个时候咬你:-)

标签: java swing event-listener propertychanged jformattedtextfield


【解决方案1】:

实际上,setCommitOnValidEdit 应该始终按您的预期工作(并且在下面的代码 sn-p 中),不需要 DocumentListener,毕竟该方法正是为此目的。因此,我怀疑您的上下文中还有其他问题。或者由于某种原因,第一次编辑没有被解析为任何有效的东西?

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

【讨论】:

  • 两者都很难听,不爱另一个听众一起+1
【解决方案2】:

可能你得看看DocumentListener例子here

编辑:

我从第一次接触 JFormattedTextField 时就知道了这个问题,下面的例子在最初的 focusLost 中不起作用:-) 并且可能证明了你的问题

10.000,-JFormattedTextField 设置了最低限制,

第一。 JFormattedTextField处理FocusListener(输出必须延迟到invokeLater

第二。 JFormattedTextField 处理 DocumentListener(适用于每个...)

初始外观

这是同样的问题,因为我只放了 500,-并且在 focusLost 上没有任何改变,正确的数量必须是 >= 10.000,-

在 2dn 上。 focusLost 工作....

不知道这怎么可能,但通过包装到invokeLater() 解决了,然后在第一个工作。 focusLost(你必须取消注释这些代码行)

来自代码

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

【讨论】:

  • 这里是相关的example
  • 嗨; invokeLater 无效!但是DocumentListener 有效;谢谢
  • :-) 是否调用了第二种方法,不是 formTextFieldFocus1() 而是 formTextFieldFocus(),很高兴能提供帮助 +1
猜你喜欢
  • 2019-08-14
  • 2011-06-01
  • 1970-01-01
  • 2012-07-09
  • 2016-10-17
  • 2013-09-15
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多