Model,Listener und background jobs

G

Gast2

Gast
Hallo zusammen,

Im Model werden events gefeuert auf die in der GUI gehorcht werden. Nun gibt es aber bei den background Jobs/Threads Probleme, da diese nicht zum EDT synchronisiert werden. Wie kann ich das am besten machen. Ich würde ungern alle GUI Klassen anfassen und in den Listener ein
Code:
 if(SwingUtilities.isEventDispatchThread())
und je nachdem synchronisieren oder den ablauf fortsetzen. Und in den Models will ich keine Abhängigkeit zu Swing also kommt es beim feuern gar nicht in Frage. Gibt es hierfür ein geeignetes Pattern, eine beste Practice oder hat jemand so eine gute Idee?

Danke
 

Marco13

Top Contributor
Da war im "Umkreis" dieses Beitrags http://www.java-forum.org/awt-swing...en-gui-anderen-threads-heraus.html#post591879 schon mal eine Diskussion dazu. Ich weiß nicht, ob es da "DIE" Lösung gibt. Je nach ... Struktur und Anwendungsfall gibt's da IMHO mehrere Ansätze:

- Das Modell feuert alle Events pauschal auf dem EDT
Du meinst, das "kommt nicht in Frage", und in den meisten Fällen stimmt das wohl - ich erwähne es eher der Vollständigkeit halber, weil es in bestimmten Kontexten Sinn machen KÖNNTE

- Das GUI verarbeitet alle einkommenden Events Thread-Safe
D.h. das GUI kann auf jedem Thread benachrichtigt werden, und kümmert sich selbst darum, dass "seine" Swing-Components nur auf dem EDT verändert werden (ggf. mit isEventDispatchThread-Abfrage)

- Man muss sich beim Herstellen der Verbindung zwischen Model und View um diese Dinge kümmern
Genau wie man ein Swing-Modell nicht auf jedem Thread verändern darf, darf man das ggf. bei "eigenen" Modell-Klassen auch nicht. Es ist Sache desjenigen, der das ganze verwendet, sicherzustellen, dass alles passt....

- Man erstellt "Proxy"-Klassen, die keine andere Funktion haben, als die Threadsicherheit herzustellen.
Das klingt erstmal komisch. IST es vielleicht auch :D Das Potential der dynamischen Proxy-Klassen ist mit erst kürzlich andeutungsweise bewußt geworden. Tatsächlich muss man da in erster Näherung nur EINE Zeile einfügen (hier mit [c]// It's a kind of magic...[/c] markiert). Für die praktische Anwendung müßte man sich da noch mehr überlegen, aber... ich wollt' das halt grad mal ausprobieren ... :oops:
Java:
// Marco13 for [url]http://www.java-forum.org/awt-swing-swt/94565-model-listener-background-jobs.html#post600770[/url]

import java.lang.reflect.*;

import javax.swing.*;

public class SwingProxyTest extends JFrame implements ExampleListener
{
    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                SwingProxyTest s = new SwingProxyTest();
                s.setVisible(true);

                ExampleListener listener = s;

                // It's a kind of magic...
                listener = SwingProxyFactory.createProxy(ExampleListener.class, s);

                ExampleModel exampleModel = new ExampleModel(listener);
                exampleModel.start();
            }
        });
    }

    private JTextArea textArea;

    public SwingProxyTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        textArea = new JTextArea();
        getContentPane().add(textArea);
        setSize(500,500);
    }

    @Override
    public void fireEvent(String message)
    {
        textArea.append(message+" from "+Thread.currentThread()+"\n");
    }
}


class ExampleModel implements Runnable
{
    private ExampleListener exampleListener;

    public ExampleModel(ExampleListener exampleListener)
    {
        this.exampleListener = exampleListener;
    }

    public void start()
    {
        Thread t = new Thread(this);
        t.start();
    }

    public void run()
    {
        while (true)
        {
            exampleListener.fireEvent(""+System.currentTimeMillis());
            try
            {
                Thread.sleep(500);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
}

interface ExampleListener
{
    void fireEvent(String message);
}


class SwingProxyFactory
{
    @SuppressWarnings("unchecked")
    public static <T> T createProxy(Class<?> c, final T delegate)
    {
        return (T)java.lang.reflect.Proxy.newProxyInstance(
            c.getClassLoader(),
            new Class<?>[]{c},
            new InvocationHandler()
            {
                public Object invoke(Object proxy, final Method method, final Object[] args)
                    throws Throwable
                {
                    if (SwingUtilities.isEventDispatchThread())
                    {
                        return method.invoke(delegate, args);
                    }
                    if (method.getReturnType().equals(void.class))
                    {
                        // Could be blocking with invokeAndWait, 
                        // currently it's non-blocking
                        SwingUtilities.invokeLater(new Runnable()
                        {
                            public void run()
                            {
                                try
                                {
                                    method.invoke(delegate, args);
                                }
                                catch (IllegalArgumentException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (IllegalAccessException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (InvocationTargetException e)
                                {
                                    e.printStackTrace();
                                }
                            }
                        });
                        return null;
                    }
                    else
                    {
                        final Object result[] = new Object[1];
                        SwingUtilities.invokeAndWait(new Runnable()
                        {
                            public void run()
                            {
                                try
                                {
                                    result[0] = method.invoke(delegate, args);
                                }
                                catch (IllegalArgumentException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (IllegalAccessException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (InvocationTargetException e)
                                {
                                    e.printStackTrace();
                                }
                            }
                        });
                        return result[0];
                    }
                }
            });
    }
}
 
G

Gast2

Gast
Da war im "Umkreis" dieses Beitrags http://www.java-forum.org/awt-swing...en-gui-anderen-threads-heraus.html#post591879 schon mal eine Diskussion dazu. Ich weiß nicht, ob es da "DIE" Lösung gibt. Je nach ... Struktur und Anwendungsfall gibt's da IMHO mehrere Ansätze:

- Das Modell feuert alle Events pauschal auf dem EDT
Du meinst, das "kommt nicht in Frage", und in den meisten Fällen stimmt das wohl - ich erwähne es eher der Vollständigkeit halber, weil es in bestimmten Kontexten Sinn machen KÖNNTE

- Das GUI verarbeitet alle einkommenden Events Thread-Safe
D.h. das GUI kann auf jedem Thread benachrichtigt werden, und kümmert sich selbst darum, dass "seine" Swing-Components nur auf dem EDT verändert werden (ggf. mit isEventDispatchThread-Abfrage)

- Man muss sich beim Herstellen der Verbindung zwischen Model und View um diese Dinge kümmern
Genau wie man ein Swing-Modell nicht auf jedem Thread verändern darf, darf man das ggf. bei "eigenen" Modell-Klassen auch nicht. Es ist Sache desjenigen, der das ganze verwendet, sicherzustellen, dass alles passt....

- Man erstellt "Proxy"-Klassen, die keine andere Funktion haben, als die Threadsicherheit herzustellen.
Das klingt erstmal komisch. IST es vielleicht auch :D Das Potential der dynamischen Proxy-Klassen ist mit erst kürzlich andeutungsweise bewußt geworden. Tatsächlich muss man da in erster Näherung nur EINE Zeile einfügen (hier mit [c]// It's a kind of magic...[/c] markiert). Für die praktische Anwendung müßte man sich da noch mehr überlegen, aber... ich wollt' das halt grad mal ausprobieren ... :oops:
Java:
// Marco13 for [url]http://www.java-forum.org/awt-swing-swt/94565-model-listener-background-jobs.html#post600770[/url]

import java.lang.reflect.*;

import javax.swing.*;

public class SwingProxyTest extends JFrame implements ExampleListener
{
    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                SwingProxyTest s = new SwingProxyTest();
                s.setVisible(true);

                ExampleListener listener = s;

                // It's a kind of magic...
                listener = SwingProxyFactory.createProxy(ExampleListener.class, s);

                ExampleModel exampleModel = new ExampleModel(listener);
                exampleModel.start();
            }
        });
    }

    private JTextArea textArea;

    public SwingProxyTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        textArea = new JTextArea();
        getContentPane().add(textArea);
        setSize(500,500);
    }

    @Override
    public void fireEvent(String message)
    {
        textArea.append(message+" from "+Thread.currentThread()+"\n");
    }
}


class ExampleModel implements Runnable
{
    private ExampleListener exampleListener;

    public ExampleModel(ExampleListener exampleListener)
    {
        this.exampleListener = exampleListener;
    }

    public void start()
    {
        Thread t = new Thread(this);
        t.start();
    }

    public void run()
    {
        while (true)
        {
            exampleListener.fireEvent(""+System.currentTimeMillis());
            try
            {
                Thread.sleep(500);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
}

interface ExampleListener
{
    void fireEvent(String message);
}


class SwingProxyFactory
{
    @SuppressWarnings("unchecked")
    public static <T> T createProxy(Class<?> c, final T delegate)
    {
        return (T)java.lang.reflect.Proxy.newProxyInstance(
            c.getClassLoader(),
            new Class<?>[]{c},
            new InvocationHandler()
            {
                public Object invoke(Object proxy, final Method method, final Object[] args)
                    throws Throwable
                {
                    if (SwingUtilities.isEventDispatchThread())
                    {
                        return method.invoke(delegate, args);
                    }
                    if (method.getReturnType().equals(void.class))
                    {
                        // Could be blocking with invokeAndWait, 
                        // currently it's non-blocking
                        SwingUtilities.invokeLater(new Runnable()
                        {
                            public void run()
                            {
                                try
                                {
                                    method.invoke(delegate, args);
                                }
                                catch (IllegalArgumentException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (IllegalAccessException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (InvocationTargetException e)
                                {
                                    e.printStackTrace();
                                }
                            }
                        });
                        return null;
                    }
                    else
                    {
                        final Object result[] = new Object[1];
                        SwingUtilities.invokeAndWait(new Runnable()
                        {
                            public void run()
                            {
                                try
                                {
                                    result[0] = method.invoke(delegate, args);
                                }
                                catch (IllegalArgumentException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (IllegalAccessException e)
                                {
                                    e.printStackTrace();
                                }
                                catch (InvocationTargetException e)
                                {
                                    e.printStackTrace();
                                }
                            }
                        });
                        return result[0];
                    }
                }
            });
    }
}

Punkt 1 und 2 wollte ich ja verhindern...
Punkt 3 find ich auch nicht so prickelnd.
Punkt 4 müsste ich mit mal genauer anschauen... Was ich nicht versteh warum unterscheidest du zwischen void (invokeLater) und welche die einen Rückgabwert(invokeAndWait) haben?
 

Marco13

Top Contributor
Punkt 1 und 2 wollte ich ja verhindern...
Punkt 3 find ich auch nicht so prickelnd.
Punkt 4 müsste ich mit mal genauer anschauen... Was ich nicht versteh warum unterscheidest du zwischen void (invokeLater) und welche die einen Rückgabwert(invokeAndWait) haben?

Hmja, du hattest ja gesagt, dass 1 und 2 nicht so toll sind, und das stimmt ja auch, aber ... mal ganz objektiv-pragmatisch: Man hat drei ... "Entitäten":
- Ein Modell
- Eine View
- Einen Controller

Modell und View haben unterschiedliche Threadanforderungen. Die Erfüllung dieser Anforderungen kann ja nun nur an drei Stellen sichergestellt werden:
- Im Modell
- In der View
- Im Controller

Wenn man jetzt (was ich noch am ehesten als "pauschal berechtigt" ansehen würde) das Modell für diese Zwecke ausschließt, und diese Dinge in der View zumindest "gerne verhindern" würde, wird die Luft eben langsam dünn... ;)

Wenn man also... (für sich selbst und seinen eigenen, konkreten Anwendungfall) zu dem Schluss kommt, dass die Threadfragen vom Controller geklärt werden "müssen", dann "muss" das eben so sein, auch wenn's "nicht so prickelnd" ist. DANN geht es nur noch um die Frage, WIE man das genau macht.

Die Sache mit den Proxies war eher eine ... "verrückte Idee", also... das sollte man nicht so unüberlegt einbauen, aber... ich finde den Ansatz (wegen seiner Einfachheit und Flexibilität) eben ganz interessant.... Kann gut sein, dass ich das mal irgendann aufbohre.

Der Unterschied zwischen "void" und "nicht void" ist (wie ja auch durch den (einzigen :oops: ) Kommentar angdeutet ist) ein bißchen diffizil. Wenn eine Methode einen Wert zurückliefern soll, dann MUSS sie mit InvokeAndWait aufgerufen werden - andernfalls kommt man ja nicht an den Rückgabewert. Listener-Methoden sind aber ... eigentlich IMMER (!? ???:L ?!) void-Methoden, d.h. da braucht man eigentlich nicht zu warten. Wenn aber ein Modell z.B. 1000 Events pro Sekunde feuert/feuern will, und die Abarbeitung jedes Events in der GUI 1 Sekunde dauert, dann dürfte die Swing-Event-Queue ziemlich schnell vollaufen. "Sicherer" um das zu verhindern wäre eigentlich, IMMER invokeAndWait zu verwenden - allerdings bremst ein langsames GUI dann u.U. den Modell-Thread aus (je nachdem, wie viele Events der wirft...). Ausgefeiltere Methoden, um das zu verhindern (irgendwelches Coalescing oder so) müßte man sich halt noch überlegen...

Ganz nebenbei: Der Fall, dass auch auf das Modell nur in einem bestimmten Thread zugegriffen werden darf, kann ja auch auftreten... Das sollte ggf. auch berücksichtigt werden...
 
G

Gast2

Gast
Hmja, du hattest ja gesagt, dass 1 und 2 nicht so toll sind, und das stimmt ja auch, aber ... mal ganz objektiv-pragmatisch: Man hat drei ... "Entitäten":
- Ein Modell
- Eine View
- Einen Controller

Modell und View haben unterschiedliche Threadanforderungen. Die Erfüllung dieser Anforderungen kann ja nun nur an drei Stellen sichergestellt werden:
- Im Modell
- In der View
- Im Controller

Wenn man jetzt (was ich noch am ehesten als "pauschal berechtigt" ansehen würde) das Modell für diese Zwecke ausschließt, und diese Dinge in der View zumindest "gerne verhindern" würde, wird die Luft eben langsam dünn... ;)

Wenn man also... (für sich selbst und seinen eigenen, konkreten Anwendungfall) zu dem Schluss kommt, dass die Threadfragen vom Controller geklärt werden "müssen", dann "muss" das eben so sein, auch wenn's "nicht so prickelnd" ist. DANN geht es nur noch um die Frage, WIE man das genau macht.

Ja das stimmt ich dachte auch an eine "Zwischenschicht" ne Art Behavior Klasse auf das Model die das z.B. regeln könnte
Die Sache mit den Proxies war eher eine ... "verrückte Idee", also... das sollte man nicht so unüberlegt einbauen, aber... ich finde den Ansatz (wegen seiner Einfachheit und Flexibilität) eben ganz interessant.... Kann gut sein, dass ich das mal irgendann aufbohre.

Der Unterschied zwischen "void" und "nicht void" ist (wie ja auch durch den (einzigen :oops: ) Kommentar angdeutet ist) ein bißchen diffizil. Wenn eine Methode einen Wert zurückliefern soll, dann MUSS sie mit InvokeAndWait aufgerufen werden - andernfalls kommt man ja nicht an den Rückgabewert. Listener-Methoden sind aber ... eigentlich IMMER (!? ???:L ?!) void-Methoden, d.h. da braucht man eigentlich nicht zu warten. Wenn aber ein Modell z.B. 1000 Events pro Sekunde feuert/feuern will, und die Abarbeitung jedes Events in der GUI 1 Sekunde dauert, dann dürfte die Swing-Event-Queue ziemlich schnell vollaufen. "Sicherer" um das zu verhindern wäre eigentlich, IMMER invokeAndWait zu verwenden - allerdings bremst ein langsames GUI dann u.U. den Modell-Thread aus (je nachdem, wie viele Events der wirft...). Ausgefeiltere Methoden, um das zu verhindern (irgendwelches Coalescing oder so) müßte man sich halt noch überlegen...
okay stimmt habe ich mir zu wenig Gedanken dazu gemacht^^

Ganz nebenbei: Der Fall, dass auch auf das Modell nur in einem bestimmten Thread zugegriffen werden darf, kann ja auch auftreten... Das sollte ggf. auch berücksichtigt werden...
Ja ich gehe davon aus dass jeder Thread drauf zugreifen darf und nebenläufigkeiten werde mit synchronized geregelt...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Model Listener beim JTree AWT, Swing, JavaFX & SWT 5
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
S UI Model Binding AWT, Swing, JavaFX & SWT 7
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
B JavaFX mvvmfx - Model AWT, Swing, JavaFX & SWT 3
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
M JList Model filtern AWT, Swing, JavaFX & SWT 4
O Swing JTextField Sync View -> Model AWT, Swing, JavaFX & SWT 3
S Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren AWT, Swing, JavaFX & SWT 6
P jTable model setzen AWT, Swing, JavaFX & SWT 6
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
earlgrey_tea JTextfield Model AWT, Swing, JavaFX & SWT 14
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
O Swing JTable - Zeilen färben (mit Model) AWT, Swing, JavaFX & SWT 13
C Swing JTable verbindet sich nicht mit Model AWT, Swing, JavaFX & SWT 20
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
C Swing MVC Verbindung von Model und Db AWT, Swing, JavaFX & SWT 23
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
R Swing Designfrage - Zusammenspiel Model / View AWT, Swing, JavaFX & SWT 10
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
J Swing SwingActions und das Problem auf den View bzw. das Model zuzugreifen AWT, Swing, JavaFX & SWT 2
K Swing JTable Model aktualisieren AWT, Swing, JavaFX & SWT 2
C Swing JComboBox probleme bei Set Model AWT, Swing, JavaFX & SWT 5
T JTable Model AWT, Swing, JavaFX & SWT 5
D Swing JTable Model View Problem AWT, Swing, JavaFX & SWT 6
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
M Swing Model an View binden AWT, Swing, JavaFX & SWT 4
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
Z JLIST / Model erster EINTRAG AWT, Swing, JavaFX & SWT 11
X Swing JList -> Daten anders darstellen als im Model hinterlegt -> möglich ? AWT, Swing, JavaFX & SWT 9
N Model Aktualisieren AWT, Swing, JavaFX & SWT 4
N Swing JComboBox: Auf Model- und Selectionänderungen reagieren AWT, Swing, JavaFX & SWT 2
D JTable, Model, Fokus AWT, Swing, JavaFX & SWT 3
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
R Swing alle Frames nutzen das gleiche Model AWT, Swing, JavaFX & SWT 2
S JList mit Vector als Model? AWT, Swing, JavaFX & SWT 12
S JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems) AWT, Swing, JavaFX & SWT 2
J JTable Model laesst sich nicht serialisieren? AWT, Swing, JavaFX & SWT 16
D ComboBox(Model) mit dummyItem AWT, Swing, JavaFX & SWT 10
G JComboBox mit eigenem Model vorhanden, wie selektieren AWT, Swing, JavaFX & SWT 29
M MVC: Grundidee verstanden aber was machen mit mehreren Model AWT, Swing, JavaFX & SWT 2
V JList ist leer -Model ist voll. Ja, ne is klaaa. AWT, Swing, JavaFX & SWT 8
K JSpinner - Model <-> View, unterschiedliche Werte AWT, Swing, JavaFX & SWT 9
W Suche großes vollständiges Swing GUI Beispiel nach MVC Model AWT, Swing, JavaFX & SWT 5
P jTable mit Model lässt sich nicht neu laden AWT, Swing, JavaFX & SWT 5
P JTable/Model füllen mit Fortschrittsbalken, Var. Rückgabetyp AWT, Swing, JavaFX & SWT 2
J model von jcombobox AWT, Swing, JavaFX & SWT 4
D Swing und MVC und doppeltes Model? AWT, Swing, JavaFX & SWT 5
G JTable und Model AWT, Swing, JavaFX & SWT 21
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
J JTable / Model Daten verändern AWT, Swing, JavaFX & SWT 5
C Model View Controller - Beispielimplementation AWT, Swing, JavaFX & SWT 5
C [JTable] ArrayIndexOutOfBoundsException im Model AWT, Swing, JavaFX & SWT 8
Icewind Jlist zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
Icewind JTable zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
G Neues Model für JTextField erstellen AWT, Swing, JavaFX & SWT 8
A Gemeinsames Model für Baum- und Graphdarstellung-wie gehts? AWT, Swing, JavaFX & SWT 9
S Frage zu Table(Column)Model AWT, Swing, JavaFX & SWT 3
H Model umbauen ? AWT, Swing, JavaFX & SWT 5
M SWT und Model View Controller? AWT, Swing, JavaFX & SWT 8
J Table Model AWT, Swing, JavaFX & SWT 2
J Abstract Table Model AWT, Swing, JavaFX & SWT 7
padde479 MenuItem MouseEvent/-Listener AWT, Swing, JavaFX & SWT 5
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
M List Listener AWT, Swing, JavaFX & SWT 37
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
U Funktionsweise Listener AWT, Swing, JavaFX & SWT 1
L TextField Listener AWT, Swing, JavaFX & SWT 13
K Nullpointer Combobox Listener AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Salo JTabel Selection listener Bsp. AWT, Swing, JavaFX & SWT 5
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
J Action Listener Rückgabewert AWT, Swing, JavaFX & SWT 14
MaxG. Swing JMenu einen Listener Hinzufügen AWT, Swing, JavaFX & SWT 25
L JavaFX Verbindung zwischen Beschreibung und Listener (Codebehind Klasse) AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
S Swing Tabellen - Listener & richtige Row AWT, Swing, JavaFX & SWT 3
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
S Erste Schritte mit GUI - Fileverarbeitung, Listener,... AWT, Swing, JavaFX & SWT 10
M JButton - Listener AWT, Swing, JavaFX & SWT 1
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
K JavaFX Focus Listener für gesamte Scene AWT, Swing, JavaFX & SWT 1
M Key Listener reagiert nicht AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben