Diskuze: JavaFX FXML formulář

Java Java JavaFX FXML formulář

Avatar
Michal Remišovský:

Zdravím,
žádám o radu. Ve vyskakovacím okně (druhá stage FXML) mám mimo jiné TextField, dva ComboBoxy a Button nahodneVlastnosti. Pomocí této metody testuji zadání/výběr hodnot :

@FXML
    private void handleVyber(ActionEvent event) {
        if (!(jmenoPostavyTextField.getText().equals("")) &&
           (rasaComboBox.getSelectionModel().getSelectedItem() != null) &&
           (povolaniComboBox.getSelectionModel().getSelectedItem() != null))
           nahodneVlastnostiButton.setDisable(false);
        else nahodneVlastnostiButton.setDisable(true);
    }

Tlačítko nahodneVlastnosti má nastaveno Disable na true. Chci povolit Button až po zadání/výběru hodnot. Comboboxy fungují dle očekávání, ale TextField, pokud si jeho vyplnění nechám na konec, zadám hodnotu a opustím ho jinak než stisknutím Enteru, metodu onAction handleVyber nepustí, respektive tlačítko nahodneVlastnosti má stále Disable true.

Za druhé, jak dosáhnu toho, abych klávesou Tab přeskakoval na prvky podle toho, jak chci (nadefinuji). V Controlleru je mám deklarované ve "správném" pořadí, ale na klíč, podle kterého přeskakují jsem nepřišel.

Editováno 3. září 8:19
 
Odpovědět 3. září 8:17
Avatar
Atrament
Člen
Avatar
Atrament:

Správného pořadí pro to přeskakování tabem dosáhneš tak, že ty prvky správně seřadíš v FXML souboru - poskakuje to po těch prvcích tak jak jsou tam uvedené shora dolů.

 
Nahoru Odpovědět  +1 3. září 8:55
Avatar
Odpovídá na Michal Remišovský
Petr Štechmüller:

Ahoj, k první otázce: můžeš přidat onKeyPressed listener, který nabinduješ na metodu handleVyber. Tím zajistíš, že se bude vykonávat při každém zmáčknutí klávesy.

Nahoru Odpovědět  +1 3. září 11:44
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Atrament
Michal Remišovský:

Atrament: To mi nefunguje. Podle toho, co jsem četl na Stackowerflow to funguje, pokud jsou na vyskakovacím okně stejné prvky bez dalších kontejnerů, nebo pokud jsou stejné prvky ve stejných typech kontejnerů (a možná na stejné úrovni). V dotazu jsem strukturu neuvedl, mám to trochu složitější - VBox, GirdPane a pak teprve Labely a ComboBoxy. Jednotit se mi to nehodí kvůli desingu. Dělá se to nějak přez on Key pressed, to testuje stisknutí Tab a tím se spustí metoda on Action, která nastaví jako aktivní prvek "další", ale jak přesně, to jsem nepochopil.

Editováno 4. září 11:07
 
Nahoru Odpovědět 4. září 11:06
Avatar
Odpovídá na Petr Štechmüller
Michal Remišovský:

Petr Štechmüller: Nejsem si jistý, jestli to dělám správně, když přiřadím do pole On Key Pressed metodu handleVyber, vyhodí to vyjímku:
IllegalArgumen­tException: argument type mismatch

 
Nahoru Odpovědět 4. září 11:13
Avatar
Odpovídá na Michal Remišovský
Petr Štechmüller:

Jasný, to znamená, ze se předává špatný parametr te funkci handleVyber. Takže to můžeš udělat tak, ze udalost onKeyPressed nabindujes na jinou metodu, ze které budeš jednoduše volat už tu správnou metodu.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 4. září 11:18
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Michal Remišovský
Petr Štechmüller:

To je dobře, že Ti to už funguje.
Jenom poznámka na okraj. Z tvého prvního příspěvku je vidět ne moc ideální návrh kódu. Ty vlastně v kontroleru vykonáváš nějakou logickou činnost, což není úplně výhodné. Zkus se podívat po bidirectional bindingu, neboli obousměrnému bindování hodnot. Jedná se o to, že jednotlivé položky, jako je jméno, rasa, povolání nabinduješ na property nějakého modelu. Možná to zní složitě, ale pokud by jsi měl o to zájem, tak se koukni sem: https://github.com/stechy1/dracak. Připravil jsem jednoduchou ukázku implementace tvého problému pomocí binding property. Možná je tam trochu více kódu, ale na druhou stranu by to mělo být robustnější řešení.

Nahoru Odpovědět 4. září 13:09
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
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 10 zpráv z 10.