jFormattedTextfield:入力期間値
-
19-09-2019 - |
質問
使いたいです JFormattedTextField
ユーザーが時間を入力できるようにします 間隔 フォームへの値。サンプルの有効な値は次のとおりです。
2h 30m
72h 15m
6h
0h
しかし、私はこれで限られた成功を収めています。誰かがこれをどのように達成できるかを提案できますか?この結果を使用して達成できれば大丈夫です JTextField
同じように。
ありがとう!
それが何かの価値があるなら、ここに私の現在の試みがあります:
mFormattedText.setFormatterFactory(
new DefaultFormatterFactory(
new DateFormatter(
new SimpleDateFormat("H mm"))));
これを除いて、これは次のとおりです。
私は得ることができない*h
とm
プレーンテキストとして表示するには(逃げようとしました)- 時間数には最大です
*: @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形式を使用します。これにはが含まれます Period
と Duration
タイムラインに添付されていない時間のスパンを表すためのクラス。
Duration d = Duration.ofHours( 1 ).plusMinutes( 30 );
String output = d.toString();
他の方向に進み、文字列を解析します。
Duration d = Duration.parse( "PT1H30M" );
Java.timeについて
Java.Time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古いものに取って代わります 遺産 次のような日付クラス java.util.Date
, Calendar
, & SimpleDateFormat
.
ジョーダタイム プロジェクト、今 メンテナンスモード, 、への移行をアドバイスします Java.Time クラス。
詳細については、を参照してください Oracleチュートリアル. 。多くの例と説明については、スタックオーバーフローを検索します。仕様はです JSR 310.
Java.Timeクラスはどこで入手できますか?
- Java SE 8 と SE 9 以降
- 組み込み。
- バンドルされた実装を備えた標準Java APIの一部。
- Java 9は、いくつかのマイナーな機能と修正を追加します。
- Java SE 6 と SE 7
- Java.timeの機能の多くは、Java 6と7にバックポートされています Threeten-Backport.
- アンドロイド
- Threetenabp プロジェクトは適応します Threeten-Backport (上記)Androidの場合は具体的に。
- 見る Threetenabpの使用方法….
Threeten-Extra プロジェクトは、追加のクラスでJava.Timeを延長します。このプロジェクトは、Java.timeに将来の追加の可能性の実証済みの基盤です。ここには、いくつかの有用なクラスがあります Interval
, YearWeek
, YearQuarter
, 、 と もっと.