【问题标题】:java JFormattedTextFieldjava JFormattedTextField
【发布时间】:2015-11-24 20:40:21
【问题描述】:

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

}
}

【问题讨论】:

    标签: java swing jformattedtextfield


    【解决方案1】:

    使用JPanelCardLayout。将两个组件放入其中 - 输入字段和格式正确的一个(我假设 JTextField 可以)。 将焦点放在其中任何一个上,将格式化的字段放在前面(使用CardLayout 上的方法),并让用户输入她的数据。在失去焦点时,处理该值(记得处理错误!),如果解析顺利,将格式正确的值放入 JTextField 并将其放在前面。

    -- 根据备注更新--

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

    更轻:子类JTextField。覆盖paintComponent,这样: a) 当组件获得焦点时,将绘图委托给super。 b) 不集中时,自己绘制格式正确的文本。

    【讨论】:

    • 这将是一个极端的解决方法,因为我希望面板上有更多字段。
    • 它工作得很好,直到用户返回到文本字段。问题归结为:在 focusGained 上将 LocalDate 字符串转回输入格式(ddMMyy)并将其设置为文本。
    • 添加了更轻量级的解决方案。
    • @Seagulltown - 可以,但你说“而不是改变它的值/文本”......
    • 我明天将尝试您的更新解决方案。听起来很有希望。
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2010-09-09
    • 2011-11-14
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多