我有一个带有DateFormat的JFormattedTextField。格式为“ddMMyy”。这种格式允许快速输入。焦点丢失我希望字段中的文本更改为LocalDate,因为这更容易阅读:
输入:“200295”。使用getValue()转换为LocalDate会使LocalDate为20. February 1995.对于“1995-02-25”(LocalDate.toString()
)的文本,这一切都很好。
当该字段失去焦点时,我希望字段中显示的文本更改为LocalDate.toString()
,而不会将字段的实际值从200295/20更改为feb 1995。
有没有办法让文字覆盖字段而不是更改它的值/文本?
到目前为止我一直在思考的问题:
主要课程:
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);
}
}
答案 0 :(得分:1)
JPanel
使用CardLayout
。将两个组件放入其中 - 输入字段和格式正确的组件(我假设JTextField
会这样做)。
关注其中任何一个,将格式化字段置于前面(使用CardLayout
上的方法),并让用户输入她的数据。在焦点丢失时,处理值(记住要处理错误!),如果解析顺利,请将正确格式化的值放在JTextField
中并将其放在前面。
- 基于备注的更新 -
轻量级解决方案:对格式化的部分使用JLabel
而不是JTextField
。请记得致电setFocusable(true)
。
更轻松:子类JTextField
。覆盖paintComponent
,以便:a)当组件聚焦时,将绘图委托给super
。 b)如果没有聚焦,请自己绘制格式正确的文本。