我有一個帶有DateFormat的JFormattedTextField。格式是「ddMMyy」。這種格式允許快速輸入。在焦點丟失時,我希望字段中的文本更改爲LocalDate,因爲它更易於閱讀:java JFormattedTextField
輸入:「200295」。使用getValue()將LocalDate轉換爲20日的LocalDate。這一切都很好,文本爲「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();
}
});
}
}
Frame類:
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
增加了更輕的解決方案。 –