2013-05-05 2 views
1

после чтения this article и this question Я попытался сделать комбо из двух: JFormattedTextField, который всегда показывает косые черты в правильных положениях и автоматически анализирует объект Date.JFormattedTextField с MaskFormatter и DateFormat

код я придумал следующий:

private DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
textField_DaRiassuntoIncassi = new JFormattedTextField(df); 
textField_ARiassuntoIncassi = new JFormattedTextField(df); 
textField_DaScadenze = new JFormattedTextField(df); 
textField_AScadenze = new JFormattedTextField(df); 
textField_DaRiassuntoIncassi.setColumns(10); 
textField_ARiassuntoIncassi .setColumns(10); 
textField_DaScadenze .setColumns(10); 
textField_AScadenze .setColumns(10); 

try 
{ 
    MaskFormatter dateMask = new MaskFormatter("##/##/####"); 
    dateMask.install(textField_DaRiassuntoIncassi); 
    dateMask.install(textField_ARiassuntoIncassi); 
    dateMask.install(textField_DaScadenze); 
    dateMask.install(textField_AScadenze); 
} 
catch(ParseException ex) 
{ 
    ex.printStackTrace(); 
} 

Проблема заключается в том, что при нажатии на текстовое поле для ввода значения, когда я печатаю эти две косые черты перемещаются по мере ввода, вместо этого я хотели бы, чтобы они оставались фиксированными (точно так же, как при нажатии клавиши «Вставить» на клавиатуре). Если я поместил MaskFormatter в конструктор, проблема исчезнет, ​​но я могу ввести любое число, которое я хочу в текстовое поле, например «99/00/9874», и компонент сообщает мне, что это значение «ok», потому что я не знаете, где подключить SimpleDateFormat.

Мое последнее средство заключается в том, чтобы поместить MaskFormatter в конструктор JFormattedTextField, получить текст с помощью метода getText(), попытаться проанализировать дату с помощью DateFormat и в случае ошибки сделать что-то, но я думаю, что есть умный способ сделать это. Я попытался с помощью метода

textField_AScadenze.setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(new SimpleDateFormat("dd/MM/yyyy")))); 

, но как только я ничего не вставить и нажмите вне косой черты исчезли. Пожалуйста, помогите. Спасибо

ответ

3
  • использование JSpinner with SpinnerDateModel (из записи, вы можете удалить два JButtons, но работа очень хороший кодер)

  • , например (не будет идти таким образом, JFormattedTextField может быть избыточна в некоторых случаях)

.

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import javax.swing.JButton; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.text.MaskFormatter; 

public class TimeFormatter extends MaskFormatter { 

    private static final long serialVersionUID = 1L; 

    public TimeFormatter() { // set mask and placeholder 
     try { 
      setMask("##/##/####"); 
      setPlaceholderCharacter('0'); 
      setAllowsInvalid(false); 
      setOverwriteMode(true); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public Object stringToValue(String string) throws ParseException { 
     SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
     if (string == null) { 
      string = "00/00/0000"; 
     } 
     return df.parse(string); 
    } 

    @Override 
    public String valueToString(Object value) throws ParseException { 
     SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
     if (value == null) { 
      value = new Date(0); 
     } 
     return df.format((Date) value); 
    } 

    private void MyGui() { 
     final MaskFormatter formatter = new TimeFormatter(); // textfield 1: create formatter and textfield 
     //formatter.setValueClass(java.util.Date.class); 
     final JFormattedTextField tf2 = new JFormattedTextField(formatter);// textfield 2: create formatter and textfield 
     tf2.setValue(new Date()); // no initial value   
     final JLabel label = new JLabel(); 
     JButton bt = new JButton("Show Value");// button to show current value 
     bt.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println(" value 2 = " + tf2.getValue()); 
       System.out.println(" value 2 = " + tf2.getText()); 
       System.out.println("value class: " + formatter.getValueClass()); 
       label.setText(tf2.getText()); 
      } 
     });   
     JFrame f = new JFrame(); // main frame 
     f.getContentPane().setLayout(new GridLayout()); 
     f.getContentPane().add(tf2); 
     f.getContentPane().add(label); 
     f.getContentPane().add(bt); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) throws Exception { 
     Runnable doRun = new Runnable() { 
      @Override 
      public void run() { 
       new TimeFormatter().MyGui(); 
      } 
     }; 
     SwingUtilities.invokeLater(doRun); 
    } 
}