1

この記事この質問を読んだ後、私は 2 つの組み合わせを作成しようとしました: 常に正しい位置にスラッシュを表示し、Date オブジェクトを自動的に解析する JFormattedTextField です。

私が思いついたコードは次のとおりです。

private DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
textField_DaRiassuntoIncassi = new JFormattedTextField(df);
textField_ARiassuntoIncassi = new JFormattedTextField(df);
textField_DaScadenze = new JFormattedTextField(df);
textField_AScadenze = new JFormattedTextField(df);
textField_DaRiassuntoIncassi.setColumns(10);
textField_ARiassuntoIncassi .setColumns(10);
textField_DaScadenze .setColumns(10);
textField_AScadenze .setColumns(10);

try
{
    MaskFormatter dateMask = new MaskFormatter("##/##/####");
    dateMask.install(textField_DaRiassuntoIncassi);
    dateMask.install(textField_ARiassuntoIncassi);
    dateMask.install(textField_DaScadenze);
    dateMask.install(textField_AScadenze);
}
catch(ParseException ex)
{
    ex.printStackTrace();
}

問題は、テキストフィールドをクリックして値を入力すると、入力時に2つのスラッシュが移動し、代わりに固定したままにしたいことです(キーボードのキー「挿入」が押されたときのように) . MaskFormatter をコンストラクターに入れると問題は解決しますが、「99/00/9874」などの任意の数値をテキストフィールドに入力でき、コンポーネントはそれが正しい値であると教えてくれます。 SimpleDateFormat をプラグインする場所。

私の最後の手段は、MaskFormatter を JFormattedTextField コンストラクターに入れ、getText() メソッドでテキストを取得し、DateFormat で日付を解析してみて、エラーが発生した場合は何かをすることですが、これを行うには賢い方法があると思います。メソッドを使ってみた

textField_AScadenze.setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(new SimpleDateFormat("dd/MM/yyyy"))));

しかし、何も挿入せずにクリックするとすぐに、スラッシュが消えます。助けてください。ありがとうございました

4

1 に答える 1

3
  • JSpinner を SpinnerDateModel と共に使用します(未記録です。2 つの JButton を削除できますが、非常に優れたコーダーの仕事です)。

  • たとえば、(このようには行かないでしょう。JFormattedTextField は、場合によってはやり過ぎになる可能性があります)。

.

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.text.MaskFormatter;

public class TimeFormatter extends MaskFormatter {

    private static final long serialVersionUID = 1L;

    public TimeFormatter() { // set mask and placeholder
        try {
            setMask("##/##/####");
            setPlaceholderCharacter('0');
            setAllowsInvalid(false);
            setOverwriteMode(true);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Object stringToValue(String string) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        if (string == null) {
            string = "00/00/0000";
        }
        return df.parse(string);
    }

    @Override
    public String valueToString(Object value) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        if (value == null) {
            value = new Date(0);
        }
        return df.format((Date) value);
    }

    private void MyGui() {
        final MaskFormatter formatter = new TimeFormatter(); // textfield 1: create formatter and textfield
        //formatter.setValueClass(java.util.Date.class);
        final JFormattedTextField tf2 = new JFormattedTextField(formatter);// textfield 2: create formatter and textfield
        tf2.setValue(new Date()); // no initial value        
        final JLabel label = new JLabel();
        JButton bt = new JButton("Show Value");// button to show current value
        bt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(" value 2 = " + tf2.getValue());
                System.out.println(" value 2 = " + tf2.getText());
                System.out.println("value class: " + formatter.getValueClass());
                label.setText(tf2.getText());
            }
        });        
        JFrame f = new JFrame(); // main frame
        f.getContentPane().setLayout(new GridLayout());
        f.getContentPane().add(tf2);
        f.getContentPane().add(label);
        f.getContentPane().add(bt);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        Runnable doRun = new Runnable() {
            @Override
            public void run() {
                new TimeFormatter().MyGui();
            }
        };
        SwingUtilities.invokeLater(doRun);
    }
}
于 2013-05-05T20:25:42.470 に答える