簡體   English   中英

PropertyChangeListener requestFocus問題

[英]PropertyChangeListener requestFocus issue

全新方向

以下是我的問題的SSCCE。 我正在嘗試使字段在輸入輸入時進行更新,在這種情況下,必須丟失焦點才能進行更新。

package test;
import java.awt.EventQueue;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.NumberFormatter;

public class Test {

    private JFormattedTextField input, input2;
    private NumberFormatter formatter;
    private DocumentListener listener;

    public Test() {
        formatter = new NumberFormatter(NumberFormat.getNumberInstance());
        input = new JFormattedTextField(formatter);
        input2 = new JFormattedTextField(formatter);

        listener = new DocumentListener() {

            private Document source = null;

            protected void update(Document doc) {
                if (source == null) {
                    System.out.println("Update");
                    source = doc;
                    if (source.equals(input.getDocument())) {
                        double temp;
                        temp = converter(((Number)input.getValue()).doubleValue());
                        input2.setValue(temp);
//                        input2.setText(Double.toString(temp));
                    } else if (source.equals(input2.getDocument())) {                       
                        double temp;
                        temp = converterBack(((Number)input2.getValue()).doubleValue());
                        input.setValue(temp);
//                        input.setText(Double.toString(temp));
                    }
                    source = null;
                }
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                update(e.getDocument());
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                update(e.getDocument());
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                update(e.getDocument());
            }
        };

        input.getDocument().addDocumentListener(listener);
        input2.getDocument().addDocumentListener(listener);
        input.setColumns(4);
        input2.setColumns(4);
        input.setValue(0.0);
        JPanel panel = new JPanel();
        panel.add(input);
        panel.add(input2);

        JOptionPane.showMessageDialog(null, panel);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Test();
            }
        });

    }

    private double converter(double value) {
        value = value * 2;

        return value;
    }
    private double converterBack(double value){
        value = value/2;

        return value;
    }
}

我需要能夠通過'converter' method使用此代碼,因此不能將命令放入method Update()中。

我已經將其與PropertyChangeListener但是顯然這不是一個好方法。

PropertyChangeListener無法解決此問題,因為該字段的Document不會引發事件...該Document是該字段的屬性,但其內容不是。

更好的解決方案是使用DocumentListener 這將在基礎文檔內容更改時通知。

您需要注意這一點,因為Document在進行更改時不喜歡更改。

在此示例中,我使用事件的源Document並將其與每個字段Document進行比較以確定應更新的內容...

例

import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.NumberFormatter;

public class Test {

    private JFormattedTextField input, input2;
    private NumberFormatter formatter;
//    private PropertyChangeListener listener;
    private DocumentListener listener;

    public Test() {
        formatter = new NumberFormatter(NumberFormat.getNumberInstance());
        input = new JFormattedTextField(formatter);
        input2 = new JFormattedTextField(formatter);

        listener = new DocumentListener() {

            private Document source = null;

            protected void update(Document doc) {
                if (source == null) {
                    System.out.println("Update");
                    source = doc;
                    if (source.equals(input.getDocument())) {
                        input2.setText(input.getText());
                    } else if (source.equals(input2.getDocument())) {
                        input.setText(input2.getText());
                    }
                    source = null;
                }
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                update(e.getDocument());
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                update(e.getDocument());
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                update(e.getDocument());
            }
        };
//        listener = new PropertyChangeListener() {
//            @Override
//            public void propertyChange(PropertyChangeEvent evt) {
//                convert(evt);
//            }
//        };

        input.getDocument().addDocumentListener(listener);
        input2.getDocument().addDocumentListener(listener);

        input.setColumns(4);
        input2.setColumns(4);
//        input.addPropertyChangeListener("value", listener);
//        input2.addPropertyChangeListener("value", listener);
        input.setValue(0.0);
        JPanel panel = new JPanel();
        panel.add(input);
        panel.add(input2);

        JOptionPane.showMessageDialog(null, panel);
    }

    private void convert(PropertyChangeEvent evt) {
        if (evt.getSource() == input) {
            if (evt.getSource() != null) {
                double temp;
                temp = converter((Double) evt.getNewValue());
                input2.setValue(temp);
            }

        }

    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Test();
            }
        });

    }

    private double converter(double value) {
        value = value * 2;

        return value;
    }

}

更新

轉換時遇到的問題是,尚未“提交”值,這意味着尚未驗證並且value屬性尚未更改。

調用getValue將返回最后的提交值。

您需要做的是先提交編輯...

if (source.equals(input.getDocument())) {
    try {
        input.commitEdit();
        double temp = ((Number) input.getValue()).doubleValue();
        temp = converter(temp);
        input2.setValue(temp);
    } catch (ParseException ex) {
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM