2013-05-05 37 views
1

閱讀後this articlethis question我試圖做兩個組合:一個JFormattedTextField總是在正確的位置顯示斜槓並自動分析Date對象。帶MaskFormatter和DateFormat的JFormattedTextField

我想出的代碼如下:

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」,並且組件告訴我這是一個好值,因爲我沒有知道在哪裏插入SimpleDateFormat。

我最後的手段是將MaskFormatter放入JFormattedTextField構造函數中,使用getText()方法獲取文本,嘗試使用DateFormat解析日期,並在發生錯誤時執行某些操作,但我認爲有一個巧妙的方法去做這個。 我嘗試使用方法

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

,但只要我不插入任何項目,點擊出斜線都不見了。 請幫忙。 謝謝

回答

3
  • 使用JSpinner with SpinnerDateModel(滿分記錄,可以對刪除兩個Jbutton將,但工作非常好編碼器)

  • 例如(會不會去這種方式,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); 
    } 
}