2015-08-30 3 views
0

У меня есть JFormattedTextField с DateFormat. формат «ddMMyy». Этот формат позволяет быстро вводить. Потеря фокуса Я хочу, чтобы текст в поле изменился на LocalDate, поскольку это легче читать:java JFormattedTextField

Вход: «200295». преобразование в LocalDate с getValue() дает LocalDate от 20 февраля 1995 года. Все это хорошо и хорошо, текст «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(); 
     } 


    }); 
} 
} 

класса Рама:

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

Используйте JPanel с CardLayout. Поместите в него два компонента - поле ввода и правильно отформатированное (предположим, JTextField). Сфокусируйтесь на любом из них, приведите форматированное поле вперед (используя методы на CardLayout) и дайте пользователю ввести свои данные. В случае потери фокуса обработайте значение (помните, чтобы иметь дело с ошибками!), И, если синтаксический анализ идет хорошо, поместите правильно отформатированное значение в JTextField и перенесите его на передний план.

- UPDATE на основе замечания -

Lightweight Решение: Используйте JLabel вместо JTextField для форматных частей. Не забудьте позвонить setFocusable(true).

Даже зажигалка: подкласс JTextField. Переопределить paintComponent так, чтобы: a) когда компонент сфокусирован, делегируйте чертеж на super. б) Когда вы не сфокусированы, нарисуйте правильно отформатированный текст самостоятельно.

+0

Это было бы экстремальным обходным путем, так как на панели мне больше всего понравилось бы поле. – Seagulltown

+0

Он работает достаточно хорошо, пока пользователь не вернется в текстовое поле. Проблема сводится к: на focusGained превращение строки LocalDate обратно в формат ввода (ddMMyy) и установка этого в качестве текста. – Seagulltown

+0

Добавлены более легкие весовые решения. –

Смежные вопросы