package eu.doppel_helix.netbeans.mantisintegration.swing; import java.math.BigInteger; import java.text.ParseException; import java.util.WeakHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JFormattedTextField; import javax.swing.JFormattedTextField.AbstractFormatter; import javax.swing.JFormattedTextField.AbstractFormatterFactory; public class TimeFormatterFactory extends AbstractFormatterFactory { private final WeakHashMap<JFormattedTextField,AbstractFormatter> cache = new WeakHashMap<>(); @Override public JFormattedTextField.AbstractFormatter getFormatter(JFormattedTextField tf) { AbstractFormatter af = cache.get(tf); if(af != null) { return af; } else { af = new TimeFormatter(); cache.put(tf, af); return af; } } } class TimeFormatter extends AbstractFormatter { Pattern patternCompound = Pattern.compile("(\\d+):(\\d+)"); Pattern pattern = Pattern.compile("(\\d+)"); @Override public Object stringToValue(String text) throws ParseException { if (text == null) { return BigInteger.ZERO; } Matcher m = patternCompound.matcher(text); Matcher m2 = pattern.matcher(text); if (m.find()) { String hourPart = m.group(1); String minutePart = m.group(2); int hours = Integer.valueOf(hourPart); int minutes = Integer.valueOf(minutePart); return BigInteger.valueOf(hours * 60 + minutes); } else if (m2.find()) { String minutesString = m2.group(1); BigInteger minutes = new BigInteger(minutesString); getFormattedTextField().setValue(minutes); return minutes; } else { return BigInteger.ZERO; } } @Override public String valueToString(Object value) throws ParseException { if (value instanceof BigInteger) { BigInteger[] parts = ((BigInteger) value).divideAndRemainder(BigInteger.valueOf(60)); return String.format("%02d:%02d", parts[0], parts[1]); } else { return "00:00"; } } }