java JFormattedTextField

时间:2015-08-30 20:06:45

标签: java swing jformattedtextfield

我有一个带有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);

}
}

1 个答案:

答案 0 :(得分:1)

JPanel使用CardLayout。将两个组件放入其中 - 输入字段和格式正确的组件(我假设JTextField会这样做)。 关注其中任何一个,将格式化字段置于前面(使用CardLayout上的方法),并让用户输入她的数据。在焦点丢失时,处理值(记住要处理错误!),如果解析顺利,请将正确格式化的值放在JTextField中并将其放在前面。

- 基于备注的更新 -

轻量级解决方案:对格式化的部分使用JLabel而不是JTextField。请记得致电setFocusable(true)

更轻松:子类JTextField。覆盖paintComponent,以便:a)当组件聚焦时,将绘图委托给super。 b)如果没有聚焦,请自己绘制格式正确的文本。