문제

나는 사용하고 싶다 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 시간 구성 요소 모두에 대해 세 가지 다른 jtextfield를 만들 수 있다는 것입니다. 시간, 분, 두 번째 (포함 된 경우)를 얻기 위해 ... 필요한 경우 그냥 연결할 수 있습니다 ... 단지 생각 ...

tl; dr

Duration.parse( "PT2H30M" )

ISO 8601

원하는 입력 형식을 기꺼이 재정의하려면 ISO 8601 기준.

패턴 PnYnMnDTnHnMnS a P 시작을 표시하려면 a T 몇 년 동안 몇 년 동안 몇 시간 분을 분리합니다.

한 시간 반입니다 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" );

보다 ideone.com의 라이브 코드.

보다 저의 비슷한 대답 a 비슷한 질문.


Java.Time에 대해

그만큼 Java.Time 프레임 워크는 Java 8 이상에 내장되어 있습니다. 이 수업은 번거로운 오래된 것을 대체합니다 유산 다음과 같은 날짜 시간 수업 java.util.Date, Calendar, & SimpleDateFormat.

그만큼 조다-시간 지금 프로젝트 유지 관리 모드, Java.Time 클래스.

자세한 내용은 오라클 튜토리얼. 많은 예와 설명에 대한 검색 스택 오버 플로우. 사양입니다 JSR 310.

Java.Time 수업을 어디에서 얻을 수 있습니까?

그만큼 Threeten-extra 프로젝트는 추가 클래스로 Java.Time을 연장합니다. 이 프로젝트는 Java.Time에 향후 추가 할 수있는 근거입니다. 여기에서 유용한 수업을 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top