purtroppo ho dovuto adottare per forza questa soluzione.
JCalendar l'ho usato e avrei preferito usarlo anche io...ma non comando io 
per i vari controlli, li ho già fatti tutti, e per quanto pesante e macchinosa sia la cosa....li ricopio qui in caso di utilità:
comparazione tra due date
codice:
private boolean compare2Dates(String giorno1, String mese1, String anno1, String giorno2, String mese2, String anno2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.set(Integer.parseInt(anno1), Integer.parseInt(mese1), Integer.parseInt(giorno1));
c2.set(Integer.parseInt(anno2), Integer.parseInt(mese2), Integer.parseInt(giorno2));
if (c1.before(c2)) {
return true;//prima data minore della seconda
} else {
return false;//seconda data maggiore o uguale della prima
}
}
verifica delle mensilità (aprile 30 giorni...)
codice:
private void verificaMensilita() {
String mese1 = (String) this.meseInizio.getSelectedItem();
String mese2 = (String) this.mesiScadenza.getSelectedItem();
String giorno1 = (String) this.giorniInizio.getSelectedItem();
String giorno2 = (String) this.giorniScadenza.getSelectedItem();
if (mese1.equalsIgnoreCase("Aprile")
|| mese1.equalsIgnoreCase("giugno")
|| mese1.equalsIgnoreCase("settembre")
|| mese1.equalsIgnoreCase("novembre")
|| mese2.equalsIgnoreCase("Aprile")
|| mese2.equalsIgnoreCase("giugno")
|| mese2.equalsIgnoreCase("settembre")
|| mese2.equalsIgnoreCase("novembre")) {
if (giorno1.equalsIgnoreCase("31")) {
this.giorniInizio.setSelectedItem("30");
}
if (giorno2.equalsIgnoreCase("31")) {
this.giorniScadenza.setSelectedItem("30");
}
}
}
verifica per il mese di febbraio della sua bisestilità
codice:
private void verificaBisestilita() {
String mese1 = (String) this.meseInizio.getSelectedItem();
String mese2 = (String) this.mesiScadenza.getSelectedItem();
String giorno1 = (String) this.giorniInizio.getSelectedItem();
String giorno2 = (String) this.giorniScadenza.getSelectedItem();
String anno2 = (String) this.annoScadenza.getSelectedItem();
String anno1 = (String) this.annoInizio.getSelectedItem();
GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
if (mese1.equalsIgnoreCase("febbraio")) {
if (gc.isLeapYear(Integer.parseInt(anno1))) {
if (giorno1.equalsIgnoreCase("31") || giorno1.equalsIgnoreCase("30")) {
this.giorniInizio.setSelectedItem("29");
}
} else {
if (giorno1.equalsIgnoreCase("31") || giorno1.equalsIgnoreCase("30") || giorno1.equalsIgnoreCase("29")) {
this.giorniInizio.setSelectedItem("28");
}
}
}
if (mese2.equalsIgnoreCase("febbraio")) {
if (gc.isLeapYear(Integer.parseInt(anno2))) {
if (giorno2.equalsIgnoreCase("31") || giorno2.equalsIgnoreCase("30")) {
this.giorniScadenza.setSelectedItem("29");
}
} else {
if (giorno2.equalsIgnoreCase("31") || giorno2.equalsIgnoreCase("30") || giorno2.equalsIgnoreCase("29")) {
this.giorniScadenza.setSelectedItem("28");
}
}
}
}
questo è il metodo che richiama tutto (il converti è rimasto invariato)
codice:
private void verificaData() {
verificaMensilita();
verificaBisestilita();
String giorno1 = (String) this.giorniInizio.getSelectedItem();
String mese1 = (String) this.meseInizio.getSelectedItem();
String anno1 = (String) this.annoInizio.getSelectedItem();
String giorno2 = (String) this.giorniScadenza.getSelectedItem();
String mese2 = (String) this.mesiScadenza.getSelectedItem();
String anno2 = (String) this.annoScadenza.getSelectedItem();
if (!(compare2Dates(giorno1, convertiMese(mese1), anno1, giorno2, convertiMese(mese2), anno2))) {
this.giorniScadenza.setSelectedItem(this.giorniInizio.getSelectedItem());
this.mesiScadenza.setSelectedItem(this.meseInizio.getSelectedItem());
this.annoScadenza.setSelectedItem(this.annoInizio.getSelectedItem());
}
}
sò che è una soluzione scomoda e poco rapida, ma tra esigenze di tempo e richieste "dall'alto" ho dovuto utilizzare questa soluzione.
per il problema originale, credo che fosse la macchina sulla quale operavo che dava problemi...ho cambiato pc e funziona tutto (quell'altro è morto miracolosamente)