У меня есть JFormattedTextField с DateFormat. формат «ddMMyy». Этот формат позволяет быстро вводить. Потеря фокуса Я хочу, чтобы текст в поле изменился на LocalDate, поскольку это легче читать:java JFormattedTextField
Вход: «200295». преобразование в LocalDate с getValue() дает LocalDate от 20 февраля 1995 года. Все это хорошо и хорошо, текст «1995-02-25» (LocalDate.toString()
).
Когда поле теряет фокус, я хочу, чтобы текст, отображаемый в поле, чтобы изменить в LocalDate.toString()
без фактического значения поля для перехода от 200295/20 февраля 1995
Есть ли способ сделать текст накладывает поле вместо изменения значения/текста?
sscce о том, что я думал до сих пор:
главный класс:
public class FormatDateTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TheFrame();
}
});
}
}
класса Рама:
public class TheFrame extends JFrame{
JPanel panel;
JPanel textPanel;
JFormattedTextField dateField;
JButton button;
JTextArea textArea;
DateFormat format;
public TheFrame() {
button = new JButton("click");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
//temporarily crates a date to be converted.
Date date = (Date) dateField.getValue();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// sends the different values of the textarea
textArea.append("The value: " + dateField.getValue() + "\n");
textArea.append("the Date: " + date.toString() + "\n");
textArea.append("the LocalDate: " + localDate.toString() + "\n");
}
});
//Sets the text to the localDate for prettyness
button.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
Date date = (Date) dateField.getValue();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
dateField.setText(localDate.toString());
}
@Override
public void focusGained(FocusEvent arg0) {
dateField.setText("");
}
});
textArea = new JTextArea();
panel = new JPanel();
textPanel = new JPanel();
panel.setLayout(new BorderLayout());
textPanel.setLayout(new BorderLayout());
//datefield and format
format = new SimpleDateFormat("ddMMyy");
dateField = new JFormattedTextField(format);
textPanel.add(textArea,BorderLayout.CENTER);
panel.add(dateField,BorderLayout.NORTH);
panel.add(button, BorderLayout.CENTER);
add(panel,BorderLayout.NORTH);
add(textPanel,BorderLayout.CENTER);
pack();
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
Это было бы экстремальным обходным путем, так как на панели мне больше всего понравилось бы поле. – Seagulltown
Он работает достаточно хорошо, пока пользователь не вернется в текстовое поле. Проблема сводится к: на focusGained превращение строки LocalDate обратно в формат ввода (ddMMyy) и установка этого в качестве текста. – Seagulltown
Добавлены более легкие весовые решения. –