質問

使いたいです JFormattedTextField ユーザーが時間を入力できるようにします 間隔 フォームへの値。サンプルの有効な値は次のとおりです。

2h 30m
72h 15m
6h
0h

しかし、私はこれで限られた成功を収めています。誰かがこれをどのように達成できるかを提案できますか?この結果を使用して達成できれば大丈夫です JTextField 同じように。

ありがとう!


それが何かの価値があるなら、ここに私の現在の試みがあります:

 mFormattedText.setFormatterFactory(
    new DefaultFormatterFactory(
        new DateFormatter(
            new SimpleDateFormat("H mm"))));

これを除いて、これは次のとおりです。

  • 私は得ることができない hm プレーンテキストとして表示するには(逃げようとしました) *
  • 時間数には最大です

*: @Nandaの回答を参照してください

役に立ちましたか?

解決

コード:

public static void main(String[] args) {
    JFrame jFrame = new JFrame();
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.setLayout(new BorderLayout());
    jFrame.setPreferredSize(new Dimension(500, 500));

    final JFormattedTextField comp = new JFormattedTextField();
    comp.setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(new SimpleDateFormat(
            "H'h' mm'm'"))));
    comp.setValue(Calendar.getInstance().getTime());

    comp.addPropertyChangeListener("value", new PropertyChangeListener() {

        @Override public void propertyChange(PropertyChangeEvent evt) {
            System.out.println(comp.getValue());

        }
    });

    jFrame.getContentPane().add(comp, BorderLayout.CENTER);

    jFrame.pack();
    jFrame.setVisible(true);
}

他のヒント

これが使用の例です InputVerifier 複数の入力形式に対応するため。

import java.awt.EventQueue;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.Box;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.text.DateFormatter;
import javax.swing.text.DefaultFormatterFactory;

public class FormattedFields {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            //@Override
            public void run() {
                new FormattedFields();
            }
        });
    }

    FormattedFields() {
        Box form = Box.createVerticalBox();

        form.add(new JLabel("Date & Time:"));
        DateTimeField dtField = new DateTimeField(new Date());
        form.add(dtField);

        form.add(new JLabel("Amount:"));
        JFormattedTextField amtField = new JFormattedTextField(
            NumberFormat.getCurrencyInstance());
        amtField.setValue(100000);
        form.add(amtField);

        JFrame frame = new JFrame();
        frame.add(form);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class DateTimeField extends JFormattedTextField {

    public DateTimeField() {
        super(DateTimeVerifier.getDefaultFormat());
        this.setInputVerifier(new DateTimeVerifier(this));
    }

    public DateTimeField(Date date) {
        this();
        this.setValue(date);
    }

    @Override
    protected void invalidEdit() {
        if (!this.getInputVerifier().verify(this)) {
            super.invalidEdit();
        }
    }
}

class DateTimeVerifier extends InputVerifier {

    private static List<SimpleDateFormat> validForms =
        new ArrayList<SimpleDateFormat>();


    static {
        validForms.add(new SimpleDateFormat("dd-MMM-yyyy HH'h':mm'm'"));
        validForms.add(new SimpleDateFormat("dd-MMM-yyyy HH:mm"));
    }
    private JFormattedTextField tf;
    private Date date;

    public DateTimeVerifier(JFormattedTextField tf) {
        this.tf = tf;
    }

    @Override
    public boolean verify(JComponent input) {
        boolean result = false;
        if (input == tf) {
            String text = tf.getText();
            for (SimpleDateFormat format : validForms) {
                try {
                    date = format.parse(text);
                    result |= true;
                } catch (ParseException pe) {
                    result |= false;
                }
            }
        }
        return result;
    }

    @Override
    public boolean shouldYieldFocus(JComponent input) {
        if (verify(input)) {
            tf.setValue(date);
            return true;
        } else {
            return false;
        }
    }

    public static SimpleDateFormat getDefaultFormat() {
        return validForms.get(0);
    }
}

やってみました H'h' mm'm'?

うーん、私が思うに、あなたは同じ目標を達成できると思います。3つの時間コンポーネントすべてに3つの異なるjTextfieldを作成します。あなたがそれが必要な場合、あなたはそれらを単に連結することができます...ただ考えて...

tl; dr

Duration.parse( "PT2H30M" )

ISO 8601

目的の入力形式を再定義することをいとわない場合は、次のように定義されている既存の形式を使用することをお勧めします。 ISO 8601 標準。

パターン PnYnMnDTnHnMnS aを使用します P 始まりをマークするには、a T 任意の年の日の部分を任意の時間分の部分から分離します。

1時間半です PT1H30M, 、 例えば。

Java.Time

Java.timeクラスは、文字列を解析/生成するときにデフォルトでISO 8601形式を使用します。これにはが含まれます PeriodDuration タイムラインに添付されていない時間のスパンを表すためのクラス。

Duration d = Duration.ofHours( 1 ).plusMinutes( 30 );
String output = d.toString();

他の方向に進み、文字列を解析します。

Duration d = Duration.parse( "PT1H30M" );

見る ideone.comのライブコード.

見る 私の同様の答え同様の質問.


Java.timeについて

Java.Time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古いものに取って代わります 遺産 次のような日付クラス java.util.Date, Calendar, & SimpleDateFormat.

ジョーダタイム プロジェクト、今 メンテナンスモード, 、への移行をアドバイスします Java.Time クラス。

詳細については、を参照してください Oracleチュートリアル. 。多くの例と説明については、スタックオーバーフローを検索します。仕様はです JSR 310.

Java.Timeクラスはどこで入手できますか?

Threeten-Extra プロジェクトは、追加のクラスでJava.Timeを延長します。このプロジェクトは、Java.timeに将来の追加の可能性の実証済みの基盤です。ここには、いくつかの有用なクラスがあります Interval, YearWeek, YearQuarter, 、 と もっと.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top