Jak ošetřit zadávání data ( datumu ) uživatelem? – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Jak ošetřit zadávání data ( datumu ) uživatelem? – Java – Fórum – Programujte.comJak ošetřit zadávání data ( datumu ) uživatelem? – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
avalagne0
Newbie
29. 4. 2013   #1
-
0
-

Ahoj,
dělám semestrální práci a mám ji téměř hotovou, ale narazil jsem na problém, se kterým si nevím rady. Mám program, který udržuje v prioritní frontě seznam kulturních akcí a pro komfort musím vytvořit jednoduché grafické prostředí. Programuji v Netbeans. Teď k problému.

Každá kulturní akce si nese název akce, datum konání (chtěl bych ve formátu DD.MM.YYYY), místo konání a čas začátku. Můj problém je v tom, že nevím, jak ošetřit vstupní zadávaný formát data, který uživatel vyplní. Zkoušel jsem to řešit přes GregorianCalendar, Calendar apod., ale nikdy jsem se nedočkal správného výsledku. Jakmile zadám například "22.10.", "22.1.", tak je vše v pořádku, zachytím chybu a vypíšu hlášku, že formát vkládaného data je špatný. Jakmile ale zadám například "22.10.2", "22.10.20" nebo "22.10.201", tak mi program spadne s chybou "java.lang.StringIndexOutOfBoundsException". Mě je jasné, proč, ale netuším, jak to vyřešit.

Můj kód:

private void buttonVlozAkciActionPerformed(java.awt.event.ActionEvent evt) {                                               
        String datum = textfieldDatumKonani.getText();
        if (!jeSpravnyFormatData(datum)) {
            textareaVypis.append("Špatně zadané parametry akce!\n");
            return;
        }
        String nazevAkce = textfieldNazevAkce.getText();
        String mistoKonani = textfieldMistoKonani.getText();
        int zacatekAkce = Integer.parseInt(textfieldCasZacatku.getText());
        int den = Integer.parseInt(datum.substring(0, 2));
        int mesic = Integer.parseInt(datum.substring(3, 5));
        mesic -= 1;
        String zadanyRok = datum.substring(6, 10); // zde je problém s tou výjimkou
        if (zadanyRok.length() != 4) {
            textareaVypis.append("Špatně zadané parametry akce!\n");
            return;
        }
        int rok = Integer.parseInt(zadanyRok);
        GregorianCalendar zadaneDatum = new GregorianCalendar(rok, mesic, den);
        if (jeVseZadane(nazevAkce, zadaneDatum, mistoKonani, zacatekAkce)) {
            KulturniAkce novaAkce = new KulturniAkce(nazevAkce, zadaneDatum,
                    mistoKonani, zacatekAkce);
            kulturniAkce.vloz(novaAkce);
            vypisAkci(novaAkce);
        } else {
            textareaVypis.append("Špatně zadané parametry akce!\n");
        }

    }

Nevíte někdo jak to jednoduše ošetřit? To GUI není podstatnou náplní práce, takže bych to chtěl řešit opravdu co nejjednodušeji, hlavně aby to fungovalo. Ještě bych doplnil, že pole pro vkládání data je typu JTextField.

Děkuji za pomoc...

Nahlásit jako SPAM
IP: 85.13.126.–
Reklama
Reklama
sleepy0
Stálý člen
29. 4. 2013   #2
-
0
-

A co takto pouzit regularny vyraz: ^\d{1,2}\.\d{1,2}\.\d{4}$ zbasti to iba d.m.yyyy alebo dd.m.yyyy alebo d.mm.yyyy alebo dd.mm.yyyy a nic ine, da sa stym slusne vyhrat. Ak string vyhovie splitnes ho podla bodky a overis este ci dni su v rozsahu od 1 do 31 a mesiace 1 do 12 a rok ak sa ti bude chciet obmedzit od teraz do par nasledujucich rokov teda, vypitas si sucastny datum a budes ho chciet od sucastnosti do, co javiem nasledujucich 50 rokov.

public boolean overenieDatumu(String datum){
	if(datum.matches("^\\d{1,2}\\.\\d{1,2}\\.\\d{4}$")){
		String[] date = date.split("\\.");
		int day = Integer.valueOf(date[0]);
		int month = Integer.valueOf(date[1]);
		int year = Integer.valueOf(date[2]);
		return validateDay(day) && validateMonth(month) && validateYear(year);
	}
	return false;
}

public boolean validateDay(int day){
	return day < 32 && day > 0; // Mozes to urobit aj pre jednotlive mesiace a prestupne roky, fantazii sa medze nekladu
}

public boolean validateMonth(int month){
	return month > 0 && month < 13
}

public boolean validateYear(int year){
	return year > 2012 && year < 2064;
}
Nahlásit jako SPAM
IP: 158.195.204.–
avalagne0
Newbie
29. 4. 2013   #3
-
0
-

#2 sleepy
Něco takového by určitě šlo   Upřímně - chtěl jsem se vyhnout regulárním výrazům, protože je moc osobně nemusím a chtěl použít kalendářů, co Java poskytuje (Calendar, GregorianCalendar) apod. Dneska jsem byl na konzultaci a učitelovi je dokonce úplně jedno, jestli tam zadám 0.0.0000 nebo co... Mám na to ještě týden, tak něco vymyslím. Nechci to nechat tak, aby prošlo nesmyslné datum.

Díky moc za odpověď, na tvůj způsob se ještě určitě podívám   

Nahlásit jako SPAM
IP: 85.13.126.–
sleepy0
Stálý člen
29. 4. 2013   #4
-
0
-

Som poteseny, tu mi neslo az tak o samotne vyhnutie sa Calendar-om, ale o to aby si si overil ze uzivatel tam nezadal uplnu nesparsovatelnu hlupost typu: "ruzovy.slon;2011:oktober,etc...". Aj ja som ich kedysi nemal rad, ale podlahol som. :D. Jednoducho ^\\d{1,2} znamena ze string musi zacinat jedno alebo dvojcifernym cislom \\. ma nasledovat bodkou \\d{1,2} za nou znova jedno alebo dvojciferne cislo \\. znova bodka a \\d{4} stvorciferne cislo. Cize sa vyhnes slovnemu zapiseu mesiacou dni, roznym hlupostima atd... . Neobmedzujem ta v nepuziti calendaru, ale ked ho vytvaras tak by si mal do neho zadavat cele cisla, inak ti tam vybehne pri parsovani Numberformat exception.

Pripadne tu som nasiel este ine riesenia: http://www.rgagnon.com/javadetails/java-0099.html . Je to s pouzitim Calendarov.

Nahlásit jako SPAM
IP: 158.195.204.–
sleepy0
Stálý člen
29. 4. 2013   #5
-
0
-

Edit: islo mi hlavne o vyhnutiu sa vyhodeniu nejakeho exceptionu.

Nahlásit jako SPAM
IP: 158.195.204.–
lukber0
Newbie
29. 4. 2013   #6
-
0
-

a co takhle:

String str = "2000-12-12";
   Date dt = null;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try 
    {
         dt = formatter.parse(str);
    }
    catch (Exception e)
    {
    }

nebylo by lepší místo JTextField použít nějakou komponentu, která umožňuje zadávat datum (DateField)?

Nahlásit jako SPAM
IP: 94.112.235.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý