IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Čtení hodnoty z JFormattedTextField

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
David Flekna
Člen
Avatar
David Flekna:26.4.2020 12:52

Snažím se načíst hodnoty z formuláře, kde je JFormattedTextField nastaveno tak, aby vracelo desetinné číslo. Tyto hodnoty pak potřebuji vložit do konstruktoru objektu, kde jsou hodnoty typu float.

Zkusil jsem: Pokud jsem použil toto:

(Float)delkaJ­FormattedTextFi­eld.getValue()

Kompilátor program spustí bez řečí, ale pak mi to vyhodí vyjímku
java.lang.Clas­sCastException: java.lang.Double cannot be cast to java.lang.Float
(datové tipy se liší podle toho, co zadám do pole)

Teprve když jsem to napsal takto :

((Number)delkaJ­FormattedTextFi­eld.getValue())­.floatValue()

Je to funkční.

Chci docílit: Proč není možné nechat program přímo přetypovat Objekt Double na Float když u neobjektových probměnných to jde ? Nebo něco dělám špatně já ? Resp. proč to Netbeans nebo kompilator nyvhodnotí jako chybu ? Ten zápis, který mi funguje mi přijde zbytečně složitý. Je to tak správně? Nebo byste doporučili jiné řešení ?

Možná se ptám z pohledu zkušených na blbost, pak se omlouvám. Jen se v tom snažím zorientovat a pochopit princip, abych v tom příště nebloudil u něčeho podobného znovu ..
Díky za názory.

Editováno 26.4.2020 12:54
 
Odpovědět
26.4.2020 12:52
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na David Flekna
Lubor Pešek:26.4.2020 13:38

Protože Double i Float dědí z Number.
Aby to fungovalo, jak ty chceš, tak by musel Double mít jednoho z předků Float.

Zkus ještě tohle:

Float.valueOf(delkaJFormattedTextField.getText());

(Ale je třeba ošetřovat number format exception, protože bys mohl takto dostat prostý text nebo jiný formát, než Float)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
26.4.2020 13:38
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
David Flekna
Člen
Avatar
Odpovídá na Lubor Pešek
David Flekna:26.4.2020 15:46

Diky za rychlou reakci. Zkoušel jsem tvou variantu ,ale to mi právě vyhodí vyjímku, protože getText() vrátí desetinnou čárku, kterou musím v tom poli vložit, ale ten float by tam rád měl destinnou tečku, kterou mi to vrátí v tom Objektu přes getValue(). Ale asi chápu princip. Number je nadřazené všem číselným objektům. Takže i to mé řešení není nijak zcestné z hlediska logiky javy.

 
Nahoru Odpovědět
26.4.2020 15:46
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na David Flekna
Lubor Pešek:26.4.2020 16:19

No ono to máš totiž tak - pokud ty tam tu desetinou čárku napíšeš, tak ono ji to právě nepřevede (protože getText() vrací vysloveně text).
V programování jsou desetiny oddělené tečkami.

Editováno 26.4.2020 16:20
Nahoru Odpovědět
26.4.2020 16:19
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.4.2020 16:30

Takže mohl bys to ošetřit. V komerci se tomuhle říká validace vstupu.

String inputText = delkaJFormattedTextField.getText();
        if (inputText != null) {
            try {
                inputText = inputText.replace(',', '.');
                Float f = Float.valueOf(inputText);
                System.out.println(f);
            } catch (NumberFormatException exp) {
                System.out.println("invalid input");
            }
        }

PS: nechápu, proč to tedy označuješ jako řešení, když ti to nepomohlo:D:D

Nahoru Odpovědět
26.4.2020 16:30
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.4.2020 16:32

Jinak jen tak pro info, proč v try catchi nezachytávám i ten null...
V rámci procesu v Javě je méně náročnější zpracovat podmínku, než celý try catch, takže je z pohledu procesu optimálnější zachytit null hodnotu v podmínce.

Nahoru Odpovědět
26.4.2020 16:32
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
David Flekna
Člen
Avatar
David Flekna:26.4.2020 17:13

Díky. Chápu to ošetření vstupu. To je v pohodě. Jen teď přemýšlím, jestli není z hlediska náročnosti zpracování jednodušší v tomto případě rovnou použít to zpracování přes Numbers. Tedy za předpokladu, že použití Numbers nemá nějaká jiná úskalí,o kterých nevím. Každopádně díky za vysvětlení.

 
Nahoru Odpovědět
26.4.2020 17:13
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.4.2020 17:31

Ber to tak - ty to takhle přetypuješ dvakrát.
Jednou na Number a podruhé na Float.
A ošetřovat to budeš muset tak či tak.

Bez toho ošetřevání by to bylo tak, jak jsem ti to psal:

Float.valueOf(delkaJFormattedTextField.getText());

S tím, že bys řekl, že to musí být zadané s tečkou.
Takže i ten Number bys měl takhle ošetřit (jak na tečku, tak na numberformat exception, tak na null).
A samozřejmě potom účelově pro tvoje účely si ještě můžeš vytvořit validaci pro sebe (třeba ošetřit rozmezí čísel nebo že třeba nepracuješ jen se zápornými čísly, atd.)

Nahoru Odpovědět
26.4.2020 17:31
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
David Flekna
Člen
Avatar
David Flekna:29.4.2020 14:20

Chápu. Díky :-)

 
Nahoru Odpovědět
29.4.2020 14:20
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.