Provo a darti un suggerimento in generale.
La GUI va anche bene, adesso bisogna capire come interagiscono i vari ed eventuali elementi (o meglio, il loro contenuto) e in che ordine.
Appuriamo che il formato data da usare sarà MM/dd/yyyy
Ineccepibile.
codice:
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
Calendar non ti serve a niente.
La data attuale, formattata secondo le tue esigenze la ottieni semplicemente applicando il formatter:
codice:
dataattuale.setText(formatter.format(new Date()));
Personalmente renderei il campo dataattuale non modificabile. Oppure se non ti serve per qualche altra ragione, non lo inserirei proprio come campo nel form.
A questo punto bisogna capire quel che succede: la data di nascita avrà un formato imposto - restiamo col formatter di cui sopra - e solo quello. I controlli da fare quando avverranno? Possibilmente quando il campo è stato compilato. Adesso ci sono svariati modi di verificare quando il campo è stato compilato. Il più rapido, senza tirare in ballo Spinners o maschere - anche se farebbero molto cool - è quello di appiccicare un listener al campo stesso e verificare quando viene modificato. Per tenere le cose semplici, io ci attaccherei un focuslistener, in particolare creandone uno ad hoc e riscrivendo solo il focusLost
codice:
private class MyFocusListener extends FocusAdapter {
String datanascita, dataattuale;
SimpleDateFormat formatter;
public MyFocusListener(String dataattuale, SimpleDateFormat formatter) {
this.formatter = formatter;
this.dataattuale = dataattuale;
}
public void focusLost(FocusEvent fe) {
try {
datanascita = dataField.getText();
Date dn = formatter.parse(datanascita);
Date da = formatter.parse(dataattuale);
if (da.after(dn)) { //valida
int e = (int)((da.getTime()-dn.getTime())/(365.25d*3600*24*1000));
eta.setText(Integer.toString(e));
}
else {
dataField.setText("");
dataField.transferFocus();
}
}
catch (Exception e) {
dataField.setText("Wrong date format");
dataField.transferFocus();
e.printStackTrace();
}
}
}
In definitiva il costruttore, utilizzando il tuo codice potrebbe diventare qualcosa del genere
codice:
public Quest (JFrame f) throws ParseException {
nameField = new JTextField(20);
cognomeField = new JTextField(20);
dataField = new JTextField(4);
eta=new JTextField(3);
Data_attuale = new JTextField(10);
JLabel label = new JLabel("Nome");
label.setLabelFor(nameField);
JLabel label1 = new JLabel("Cognome");
label.setLabelFor(cognomeField);
JLabel label3 = new JLabel("Data di nascita");
label3.setLabelFor(dataField);
JLabel label4 = new JLabel("Eta");
label4.setLabelFor(eta);
JLabel label5 = new JLabel("Data attuale");
label5.setLabelFor(Data_attuale);
JPanel labels = new JPanel(new GridLayout(5, 1));
labels.add(label);
labels.add(label1);
labels.add(label3);
labels.add(label4);
labels.add(label5);
JPanel fields = new JPanel(new GridLayout(5, 1));
fields.add(nameField);
fields.add(cognomeField);
fields.add(dataField);
fields.add(eta);
fields.add(Data_attuale);
Data_nascita= dataField.getText();
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
Data_attuale.setText(formatter.format(new Date()));
Data_attuale.setEditable(false);
eta.setEditable(false);
dataField.addFocusListener(new MyFocusListener(Data_attuale.getText(), formatter));
Box group = Box.createHorizontalBox();
group.add(labels);
group.add(fields);
JPanel container = new JPanel(new FlowLayout(FlowLayout.RIGHT));
container.add(group);
add(container);
}