3

私は持っていて、 truejFormattedTextFieldに設定setCommitsOnValidEditしてから、「値」プロパティの「プロパティ変更」にイベントリスナーを追加しました。

最初の焦点は、jFormattedTextField入力時にイベントリスナーメソッドを呼び出さないことです。しかし、「focusLost」ではイベントリスナーを呼び出し、その後再びフォーカスを受け取ると、入力時にイベントリスナーを呼び出します。

その中でいつでも変更後にイベントリスナーを呼び出してくださいjFormattedTextField(最初のフォーカスでも)。

どうしたの?どうすれば修正できますか?

4

2 に答える 2

3

実際には、setCommitOnValidEdit は常に期待どおりに動作するはずです (以下のコード スニペットでも動作します)。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);
于 2011-09-03T10:03:47.747 に答える
2

おそらくここでDocumentListenerの例を見る必要があります

編集:

私は最初のタッチからこの問題を知っていJFormattedTextFieldます。最初は機能しない例をここにfocusLost示します:-)そしておそらくあなたの問題を示しました

10.000,-両方に最低制限が設定されていますがJFormattedTextField

1位。JFormattedTextField処理FocusListener(出力は に遅延する必要がありますinvokeLater)

2番目。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();
            }
        });
    }
}
于 2011-09-02T14:10:41.963 に答える