JFormattedTextField: Eingabedauer -Dauerwert
-
19-09-2019 - |
Frage
Ich möchte a verwenden JFormattedTextField
Damit dem Benutzer die Zeit eingeben kann Dauer Werte in eine Form. Beispiele gültige Werte sind:
2h 30m
72h 15m
6h
0h
Ich habe jedoch nur begrenzte Erfolge damit. Kann jemand bitte vorschlagen, wie dies erreicht werden kann? Ich bin in Ordnung, wenn dieses Ergebnis mit a erzielt werden kann JTextField
auch.
Vielen Dank!
Wenn es etwas wert ist, hier ist mein aktueller Versuch:
mFormattedText.setFormatterFactory(
new DefaultFormatterFactory(
new DateFormatter(
new SimpleDateFormat("H mm"))));
Diese Art funktioniert außer dem:
Ich kann nicht bekommen*h
undm
als einfacher Text zu erscheinen (ich habe versucht zu entkommen)- Die Anzahl der Stunden hat maximal
*: Siehe @nandas Antwort
Lösung
Der Code:
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);
}
Andere Tipps
Hier ist ein Beispiel für die Verwendung InputVerifier
um mehrere Eingangsformate aufzunehmen.
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);
}
}
Hast du es versucht H'h' mm'm'
?
Hmm, was ich denke, dass Sie das gleiche Ziel erreichen können, indem Sie drei verschiedene JTextfield für alle dreimaligen Komponenten erstellen, eines für die Stunde, Minute und Sekunde (falls es enthalten ist), um Ihre Eingabe zu erhalten ... nur ein Gedanke. Sie könnten sie einfach verkettet, wenn Sie es notwendig sind ... nur ein Gedanke ...
tl; dr
Duration.parse( "PT2H30M" )
ISO 8601
Wenn Sie bereit sind, Ihre gewünschten Eingabeformate neu zu definieren, schlage ich vor, die bereits bestehenden Formate zu verwenden, die durch die definiert sind ISO 8601 Standard.
Das Muster PnYnMnDTnHnMnS
verwendet a P
den Anfang markieren, a T
Um alle Jahre von Jahren Monate abzubauen, von einem Teil der Stundenminuten-Sekunden.
Eineinhalb Stunden ist PT1H30M
, zum Beispiel.
Java.Time
Die Java.Time -Klassen verwenden die ISO 8601 -Formate standardmäßig beim Parsen/Generieren von Zeichenfolgen. Dies beinhaltet die Period
und Duration
Klassen zur Darstellung von Zeitspannen, die nicht an der Zeitleiste angeschlossen sind.
Duration d = Duration.ofHours( 1 ).plusMinutes( 30 );
String output = d.toString();
In die andere Richtung gehen, eine Schnur analysieren.
Duration d = Duration.parse( "PT1H30M" );
Sehen Live -Code in ideone.com.
Sehen meine ähnliche Antwort zu einem Ähnliche Frage.
Über Java.Time
Das Java.Time Das Rahmen ist in Java 8 und später in eingebaut. Diese Klassen ersetzen das lästige alte Erbe Datumszeitklassen wie z. java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Zeit Projekt jetzt in Wartungsmodus, rät die Migration zur Java.Time Klassen.
Um mehr zu erfahren, sehen Sie die Oracle Tutorial. Und Suchstapelüberlauf für viele Beispiele und Erklärungen. Spezifikation ist JSR 310.
Wo erhalten Sie die Java.Time -Klassen?
- Java Se 8 und SE 9 und später
- Eingebaut.
- Teil der Standard -Java -API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
- Java SE 6 und SE 7
- Ein Großteil der Java. TreeTen-backport.
- Android
- Das TreeTenabp Projekt passt sich an TreeTen-backport (oben erwähnt) für Android speziell.
- Sehen So verwenden Sie ThrEehenabp….
Das Treetren-extra Das Projekt erweitert Java.Time mit zusätzlichen Klassen. Dieses Projekt ist ein nachweisender Grund für mögliche zukünftige Ergänzungen zu Java. Sie können hier einige nützliche Klassen finden, wie z. Interval
, YearWeek
, YearQuarter
, und mehr.