У меня есть JSpinner с SpinnerDateModel формата «HH: mm». Я хочу, чтобы пользователь мог (например) копировать дату из «yyyy-MM-dd HH: mm: ss.SSS» из таблицы (или любого другого источника) и вставлять ее в JSpinner - HH: mm часть только. Такая полная строка даты обычно недействительна для компонента, но я все еще хочу попробовать вставленную строку и получить нужную информацию от нее (если она есть) ... Я думал, что мой метод проверки должен выглядеть примерно так, как показано ниже, но я не знаю «т знает, как изменить поведение пасты(), так что я могу добавить проверку и изменение вставленного текста ...Как проверить и изменить строку, прежде чем вставлять ее в JSpinner?
private String validateAndReturnCorrected(String pastedText) {
DateFormat hoursMinutesFormat = new SimpleDateFormat("HH:mm");
try {
// trying to paste a full date string?
DateFormat fullDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = fullDateFormat.parse(pastedText);
return hoursMinutesFormat.format(date);
} catch (ParseException ex) {
}
// trying to paste hour and minutes?
try {
Date date = hoursMinutesFormat.parse(pastedText);
return hoursMinutesFormat.format(date);
} catch (ParseException ex1) {
}
// trying to paste date in HH:mm:ss format?
try {
DateFormat hoursMinutesSecondsFormat = new SimpleDateFormat("HH:mm:ss");
Date date = hoursMinutesSecondsFormat.parse(pastedText);
return hoursMinutesSecondsFormat.format(date);
} catch (ParseException ex2) {
}
// trying to paste date in HH:mm:ss.SSS format?
try {
DateFormat hoursMinutesSecondsMilisecondsFormat = new SimpleDateFormat("HH:mm:ss.SSS");
Date date = hoursMinutesSecondsMilisecondsFormat.parse(pastedText);
return hoursMinutesFormat.format(date);
} catch (ParseException ex3) {
}
// unable to correct the string...
return "";
}
UPDATE
изменения гугла вопроса я нашел следующие два сайта, которые привели меня к решению проблемы:
- http://www.javapractices.com/topic/TopicAction.do?Id=82
- https://stackoverflow.com/a/25276224/5653483
Таким образом, решение выглядит примерно так:
class ProxyAction extends TextAction implements ClipboardOwner {
private TextAction action;
public ProxyAction(TextAction action) {
super(action.toString());
this.action = action;
}
@Override
public void actionPerformed(ActionEvent e) {
String cbc=getClipboardContents();
setClipboardContents(validateAndReturnCorrected(cbc));
action.actionPerformed(e);
setClipboardContents(cbc);
System.out.println("Paste Occured...............................................................");
}
// here goes the validateAndReturnCorrected method
public String getClipboardContents() {
String result = "";
try {
result = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
return result;
}
public void setClipboardContents(String aString) {
StringSelection stringSelection = new StringSelection(aString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, this);
}
@Override
public void lostOwnership(Clipboard clipboard, Transferable contents) {
}
}
Вот вопрос, который может вам помочь: http: // stackoverflow.com/questions/3707485/how-to-convert-string-to-date-without-know-the-format Возможно ли это, чтобы пользователь вставлял дату в текстовое поле и позволял пользователю изменять ввод, если это необходимо? –
Нет, он должен попытаться исправить вставляемую строку автоматически ... Я думаю, мне нужен способ переопределить мой метод javascript jspinner или что-то подобное ... В вопросе, который вы связали, рассматривается проблема получения даты из строки но я думаю, что я делаю это нормально в опубликованном методе проверки. – ssr