2015-08-30 24 views
0

我有一個帶有DateFormat的JFormattedTextField。格式是「ddMMyy」。這種格式允許快速輸入。在焦點丟失時,我希望字段中的文本更改爲LocalDate,因爲它更易於閱讀:java JFormattedTextField

輸入:「200295」。使用getValue()將LocalDate轉換爲20日的LocalDate。這一切都很好,文本爲「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(); 
     } 


    }); 
} 
} 

Frame類:

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

使用JPanelCardLayout。把兩個組件 - 輸入字段和格式正確的(我假設JTextField會這樣做)。 重點關注其中的任何人,將格式化的字段放在前面(使用CardLayout上的方法),並讓用戶輸入她的數據。在焦點丟失時,處理該值(記住要處理錯誤!),如果解析順利,請將格式正確的值放入JTextField並將其放在前面。

- 基於此言更新 -

輕量級的解決方案:對於格式化部分使用的JLabel而不是JTextField。只記得撥打setFocusable(true)

即使更輕:子類JTextField。覆蓋paintComponent,以便:a)組件關注時,將圖紙委託給super。 b)如果沒有專注,請自行繪製格式正確的文字。

+0

這將是一個極端的解決方法,因爲面板上有很多我想要的字段。 – Seagulltown

+0

直到用戶返回到文本字段,它才運行良好。問題歸結爲:focusGained將LocalDate字符串轉換回輸入格式(ddMMyy)並將其設置爲文本。 – Seagulltown

+0

增加了更輕的解決方案。 –