Пользовательская маска исчезает после ввода даты в JFormattedTextField - PullRequest
0 голосов
/ 17 марта 2020

Вопрос ~ У меня есть AddButton ActionListener, с помощью которого я пытаюсь очистить JFormattedTextField, сохраняя его маску ("## / ## / ####") и SimpleDateFormat. Если кто-то может помочь мне с технической частью этого, это было бы круто. Спасибо! Когда кнопка нажата, текст JFormattedTextField очищается, но я получаю исключение, если я пытаюсь установить setValue (df) или makeMask ()

private JPanel borderPanel, northPanel, westPanel;
    private JTextField name, location;
    private JFormattedTextField date;
    private static final DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
    private MaskFormatter mask = null;
    private JButton add, remove;


    private static final int FRAME_WIDTH = 850;
    private static final int FRAME_HEIGHT = 600;

    public FoodGUI() {
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        setLocationRelativeTo(null);
        // Creates the BorderLayout Panel which contains every item nested within each individual panel
        createBorderPanel();
    }

    class AddButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            name.setText("");
            location.setText("");
            try {
            date.setValue(new Date());
            date.setText("");

            } catch(Exception e1) {
                System.out.println("Hello error");
            }
            // date.setValue(df);
            // makeMask(date);

        }
    }

Мой метод makeMask и простые форматы даты первоначально применяются в приватной среде. JPanel, в котором создается JFormattedTextBox.

public void makeMask(JFormattedTextField e) {
        try {
            mask = new MaskFormatter("##/##/####");
            mask.setPlaceholderCharacter('-');
            mask.install(e);
        } catch (ParseException ex) {
            Logger.getLogger(FoodGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Вы не должны вызывать метод install напрямую. Вместо этого вы передаете средство форматирования в конструктор JFormattedTextField:

date = new JFormattedTextField(mask);

По умолчанию MaskFormatter работает со строками. Таким образом, вы захотите выполнить работу по форматированию и синтаксическому анализу самостоятельно:

date.setValue(df.format(new Date()));

// ...

String text = (String) date.getValue();
Date value = (text != null ? df.parse(text) : null);

Можно сделать JFormattedTextField принимающим и возвращающим даты напрямую, используя его унаследованный метод setValueClass , но вам придется создать свой собственный класс дат с помощью конструктора String и пользовательского метода toString. Это, вероятно, не стоит усилий.

0 голосов
/ 17 марта 2020

На этот вопрос ответил 1 формат. Я дважды форматировал, с SimpleDateFormat и MaskFormatter, но я должен был использовать только MaskFormatter. Работает нормально сейчас.

...