Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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: JavaFX rozbalovací seznam objektů

Aktivity
Avatar
tomekmichalhu:4.9.2020 19:03

Zdravím, potřebuju přes combobox v JavaFX vybírat seznam objektů (sériových portů). Každý objekt má metody které vrací jeho Stringový popis. Má i metodu toString, ale ta nevrací text který potřebuji. Místo toho potřebuji volat jinou metodu.

Zkusil jsem: Pokusil jsem se nastavít pomocí setCellFactory tovární třídu, ale to funguje jen pro buňky v rozbaleném menu. Pokuď nějakou buňku vyberu (například COM1), použije se stejné metoda toString (například VSerial9_0). Bohužel všechny ukázkové kódy tuto tovární třídu používají jen k formátování stringu (Takovej příklad je úplně naprd, když String.toString vrátí zase sám sebe.)

cmbSerialPort.setCellFactory(
                new Callback<ListView<SerialPort>, ListCell<SerialPort>>() {
                    @Override
                    public ListCell<SerialPort> call(ListView<SerialPort> param) {
                        final ListCell<SerialPort> cell = new ListCell<SerialPort>() {
                            @Override
                            public void updateItem(SerialPort item,boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    setText(item.getDescriptivePortName());
                                } else {
                                    setText(null);
                                }
                            }
                        };
                        return cell;
                    }
                }
        );

Chci docílit: Možná že existuje ještě nějaká třída settextSelected(), nebo nějaká tovární třída separátně pro vybranou buňku? On v podstatě by kód fungoval i bez toho, z comboboxu můžu vytáhnout sériový port jako objekt bez problému, ale nevypadá to hezky. Předem děkuji za odpovědi

 
Odpovědět
4.9.2020 19:03
Avatar
Odpovídá na tomekmichalhu
Petr Štechmüller:4.9.2020 19:58

Ahoj, jsi velmi blízko správnému řešení. Ještě je potřeba nastavit buttonCell. Jinak taková malá rada. Ten ListCell si dej do samostatné třídy, je to pak přehlednější. A teď už řešení:

public class Controller implements Initializable {

    public ComboBox<SerialPort> cmb;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        cmb.setCellFactory(param -> new MyCell()); // Tohle už máš
        cmb.setButtonCell(new MyCell()); // Tohle přidej

        cmb.getItems().setAll(
            new SerialPort("COM1", 9600),
            new SerialPort("COM2", 9600),
            new SerialPort("COM3", 9600)
        );
    }

    static class SerialPort {
        public final String name;
        public final int baudrate;

        public SerialPort(String name, int baudrate) {
            this.name = name;
            this.baudrate = baudrate;
        }
    }

    private class MyCell extends javafx.scene.control.ListCell<SerialPort> {

        @Override
        protected void updateItem(SerialPort item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
            } else {
                setText(item.name);
            }
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
4.9.2020 19:58
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
tomekmichalhu:4.9.2020 20:51

Já mezitím našel kratší řešení. Od rána na tom pracuju, ale dokud se někde nezeptám, tak to správný řešení nenajdu :D

cmbSerialPort.setConverter(new StringConverter<SerialPort>() {
            @Override
            public String toString(SerialPort o) {
                if(o != null)
                        return o.getDescriptivePortName();
                return "";
            }

            @Override
            public SerialPort fromString(String s) {
                return null;
            }
        });

Jinak psát třídy mimo je přehlednější, ale psát je takhle abstraktně je prej víc in. Že když se to použije vlastně jen na jednom místě, je to tak lepší. Popravdě už mi ale bylo vynadáno za oboje, dokonce v tý samý škole. Holt asi je to na preferencích :D

 
Nahoru Odpovědět
4.9.2020 20:51
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na tomekmichalhu
Lubor Pešek:4.9.2020 21:04

To ti řekl prosím tě kdo, že je to "in"?? Najdi si citát Martina Fowlera.
Ne všechen kratší zápis je vždy vhodný. Někdy to je zapotřebí a někdy to zpřehlední kód, ale v případě velkých aplikací bych někdy takové dotyčné, co tohle dělají, zastřelil.
Ano, funguje to, vypadá to složitě, je to důmyslnější syntaxe, prostě super.
Ale pak v tom něco refaktoruj, když máš objekty vnořené v 10ti vnitřních metodách.

Nahoru Odpovědět
4.9.2020 21:04
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
Odpovídá na Lubor Pešek
tomekmichalhu:4.9.2020 21:13

Já si to myslím taky, ale já jsem malý pán. Řekla mi to tuším učitelka na databáze, že prý dostatečně nezkracuji kód vymoženostmi z Javy 8. Koho chleba (kredity) jíš... :D

 
Nahoru Odpovědět
4.9.2020 21:13
Avatar
Unda
Člen
Avatar
Odpovídá na tomekmichalhu
Unda:6.9.2020 12:01

Nic proti, ale z učitelů na VŠ, bych si rozhodně nebral příklad (kor když učitel na databáze ti řekne něco ke kódu ...). 90% z nich co to učí nemají vůbec praktickou praxi a učí jen dokola to co píše osnova. Aspoň z mé zkušenosti, z 10 učitelů tak 1 nebo 2 opravdu vědí o čem mluví a i jak to vypadá a používá se v praxi :)

 
Nahoru Odpovědět
6.9.2020 12:01
Avatar
Tomáš Maňhal:6.9.2020 12:05

Problém je, že ti učitelé tě pak budou hodnotit a budeš u nich svoji práci obhajovat. A stačí jen malinkatý kousek ega na straně učitele a ty nikdy neprojdeš s odlišným přístupem. Je to vratká cesta, to naše školství :-) Občas je lepší to zkousnout, udělat jak se žádá a pak si to s diplomem v ruce vymazat z hlavy. Takhle bohužel systém funguje.

Editováno 6.9.2020 12:06
 
Nahoru Odpovědět
6.9.2020 12:05
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Tomáš Maňhal
Lubor Pešek:6.9.2020 23:04

Jo, tak to je svatá pravda. Doteď mě štve, že jeden kluk, kterého jsem učil programování, tak toho nechal, protože ho demotivoval učitel na vysoké. Palackého univerzita v Olomouci. Borec ovládal už základy, dokonce věděl přesně jak má postupovat, měl dobré myšlení, ale ten "pan profesor"...

  • hodnotil programování stylem A, F (což je první blbost. Právě v programování tento radikální přístup nemá ani v nejmenším co dělat)
  • vyrazil ho jen proto, protože mu programák fungoval přesně podle zadání, ale metodu equals si napsal sám a nevygeneroval si ji pomocí net beansů.

Takže jak jsi správně řekl - naše školství místo výchovy dobrých programátorů vychovává budoucí nezaměstnané nebo je od programování zcela odradí.

Zase na druhou stranu... kdo umí programovat, tak proč by měl ztrácet čas za pár šušňů někde na univerzitě, když v praxi získá 2x až 3x tolik.

Spíš by to mohlo fungovat tak, že by programování učili na nějaký menší úvazek zkušení programátoři a ne profesoři. Školy by ušetřili, protože by to učili skuteční nadšenci, kteří tomu rozumí. Byl by to pro ně přivídělek a ne plat a hlavně by se tak učili lidé skutečně to, co potom budou potřebovat.
Ale jak jsi sám řekl - to by se dotklo ega některých profesůrků, pro které znamená, že umí programovat, když jim výpis napíše hallo world.

Nahoru Odpovědět
6.9.2020 23:04
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
Odpovídá na Lubor Pešek
tomekmichalhu:6.9.2020 23:19

Takhle, ten nekomerční aspekt má furt něco do sebe. Těžko by mě někdo učil určité integrály, když by po mě chtěl jen webový aplikace. Měl jsem to za blbost, ale teď to používám v práci (na DPP a nechtěj o tom moc slyšet, ale...) Ale je fakt, že většina předmětů u nás na škole stojí za hovno. třeba jazyk prolog, o kterém jsem si do poslední chvíle myslel, že je to nějakej prank, až mi nakonec ta zakomplexovaná kráva nedala zápočet. Proto jsem si nedávno začal platit kurzy tady ITnetworku, abych mohl studovat to co mě zajímá. Ale nevím, vysrat se na školu, nevysrat se na školu...Tak řekněme, že jestli najdu práci za 250-300 na hodinu, tak s tím instantně seknu. Ale zatím beru docela hovno jako technik/vývojář 3D tiskáren, tak si to dovolit nemůžu.

 
Nahoru Odpovědět
6.9.2020 23:19
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.