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 und m als einfacher Text zu erscheinen (ich habe versucht zu entkommen) *
  • Die Anzahl der Stunden hat maximal

*: Siehe @nandas Antwort

War es hilfreich?

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?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top