Obsluha FXML z Vlákna – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Obsluha FXML z Vlákna – Java – Fórum – Programujte.comObsluha FXML z Vlákna – Java – Fórum – Programujte.com

 

Jirka
~ Anonymní uživatel
305 příspěvků
28. 10. 2014   #1
-
0
-

Používám JavaFX a po zmáknutí tlačítka potřebuji vypisovat text do ListViewu bez závislosti na to co se bude dít potom a nejde mi to do hlavy. Vytvořím vlákno viz. dole s instancí mého kontroleru a pak na zkoušku stále připisuji blabla.

public class Test extends Thread
{
    @Override
    public void run()
    {
        FXML2Controller con = new FXML2Controller();
        while(true)
        {
            try 
            {
                Test.sleep(500);
            } 
            catch (InterruptedException ex) 
            {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
            con.dialog.add("blabla");
            con.text.setItems(con.dialog);
        }
    }
}

*dialog je ObservableList a text je ListView
V konroleru vlákno spustím a pak to vypíše chybu: 

Exception in thread "Thread-4" java.lang.NullPointerException
at test.Test.run(Test.java:33)

Za všechny nápady jsem vděčný.

Nahlásit jako SPAM
IP: 88.103.221.–
ingiraxo+15
Grafoman
28. 10. 2014   #2
-
0
-

#1 Jirka
a co je na řádku 33 ?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Jirka
~ Anonymní uživatel
305 příspěvků
28. 10. 2014   #3
-
0
-

#2 ingiraxo
con.text.setItems(con.dialog);

Nahlásit jako SPAM
IP: 88.103.221.–
ingiraxo+15
Grafoman
28. 10. 2014   #4
-
0
-

"con.text" je null (nezapoměl jsi nasetovat?)

s javouFX nedělám, ale tipnul bych si, že se tomu nelíbí cross-thread operace, nebo spíš že v jednom vláknu se nastaví něco co v druhým není nastavený.. je potřeba přesně zjistit proč, případně zkusit celej "con" předat do vlákna parametrem

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Jirka
~ Anonymní uživatel
305 příspěvků
28. 10. 2014   #5
-
0
-

#4 ingiraxo

Text jsem zkonstruktoval a už to nehází chybu, ale nepřidává to ten text. Vypisováni do konzole funguje ještě zkusím z toho vlákna volat metodu v kontroleru a tam se bude všechno dít. Jinak díky to mě nenapadlo :)

Nahlásit jako SPAM
IP: 88.103.221.–
Jirka
~ Anonymní uživatel
305 příspěvků
28. 10. 2014   #6
-
0
-

#4 ingiraxo
Tak takhle to funguje,ale hází to stejně chybu.

Thread t1 = new Thread(new Runnable() 
        {
            @Override
            public void run() 
            {
                
                
                try 
                {
                    Thread.sleep(500);
                } 
                catch (InterruptedException ex) 
                {
                    Logger.getLogger(FXML2Controller.class.getName()).log(Level.SEVERE, null, ex);
                }
                dialog.add("blabla");
                text.setItems(dialog);
                
            }
        });  
        t1.start();
Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
	at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:204)
	at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:364)
	at javafx.scene.Scene.addToDirtyList(Scene.java:485)
	at javafx.scene.Node.addToSceneDirtyList(Node.java:424)
	at javafx.scene.Node.impl_markDirty(Node.java:415)
	at javafx.scene.Node.notifyParentsOfInvalidatedCSS(Node.java:8709)
	at javafx.scene.Node.requestCssStateTransition(Node.java:8639)
	at javafx.scene.Node.pseudoClassStateChanged(Node.java:8680)
	at javafx.scene.control.Cell$2.invalidated(Cell.java:417)
	at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109)
	at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
	at javafx.scene.control.Cell.setEmpty(Cell.java:443)
	at javafx.scene.control.Cell.updateItem(Cell.java:671)
	at com.sun.javafx.scene.control.skin.ListViewSkin$2.updateItem(ListViewSkin.java:272)
	at javafx.scene.control.ListCell.updateItem(ListCell.java:451)
	at javafx.scene.control.ListCell.lambda$new$161(ListCell.java:148)
	at javafx.scene.control.ListCell$$Lambda$192/1853532887.onChanged(Unknown Source)
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88)
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
	at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155)
	at java.util.AbstractList.add(AbstractList.java:108)
	at chater.FXML2Controller$1.run(FXML2Controller.java:178)
	at java.lang.Thread.run(Thread.java:745)
Nahlásit jako SPAM
IP: 88.103.221.–
ingiraxo+15
Grafoman
29. 10. 2014   #7
-
0
-

#6 Jirka
to je právě chyba tý cross-thread operace, v tomhle případě tomu vadí, že nemůžeš používat "klasický" vlákno v javeFX (ta pravděpodobně bude mít něco jinýho na řešení async volání)

první odkaz z googlu byl https://blogs.oracle.com/clarkeman/entry/javafx_async_task třeba pomůže

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Jirka
~ Anonymní uživatel
305 příspěvků
29. 10. 2014   #8
-
0
-

#7 ingiraxo
OK tak díky zejtra na to juknu.

Nahlásit jako SPAM
IP: 88.103.221.–
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, 30 hostů

Moderátoři diskuze

 

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