GUI außerhalb GUI-Thread updaten - GUI friert ein

qwert

Aktives Mitglied
Hallo :),

Ich möchte meine GUI außerhalb des Main-Threads aktualisieren. Im Netz stieß ich dabei auf folgende Variante:
Java:
new Thread() {
  @Override
  public void run() {
    for (;; ) {
      try {
        Thread.sleep(5000);
      } catch (InterruptedException ix) {
        return;
      }
      SwingUtilities.invokeLater(() -> {
        if (fillListFlag) {
          fillListFlag = false;
          Test.fillList();
        }
      });
    }
  }
}.start();

Hierbei wird "fillListFlag" von außen gesetzt. "fillList()" entfernt zunächst alle GUI-Elemente und fügt wieder welche hinzu.

Nun kann ich genau während den 5 Sekunden Wartezeit die GUI-Elemente bedienen, danach friert alles ein.

Woran liegt das und wie kann ich es ändern?
Falls ihr noch mehr Code braucht, bitte mitteilen, denn das Projekt ist ziemlich umfangreich, ich muss also zwangsläufig kürzen.

Vielen Dank für eure Hilfe! :)
 
Zuletzt bearbeitet von einem Moderator:

qwert

Aktives Mitglied
Hier mal die fillList-Methode:
Java:
private synchronized void fillList() {
    getContentPane().removeAll();
    setLayout(new GridLayout(5,1));
    Vector<String> chatParticipantNames = db.getChatParticipantNames();
    chatbuttons_enter = new JButton[chatParticipantNames.size()];
    chatbuttons_remove = new JButton[chatParticipantNames.size()];
    chatbuttons_add  = new JButton[chatParticipantNames.size()];
    for(int i = 0; i < chatParticipantNames.size(); i++) {
        //System.out.println("cPN = "+chatParticipantNames.get(i));
        chatbuttons_enter[i] = new JButton();
        chatbuttons_remove[i] = new JButton("Diesen Chat aus der Liste verbergen");
        chatbuttons_add[i] = new JButton("Teilnehmer aus Adressbuch hinzufügen");
        if(chatParticipantNames.get(i) != null) {
            chatbuttons_enter[i].setText(chatParticipantNames.get(i));
        }
        chatbuttons_enter[i].addActionListener(this);
        chatbuttons_remove[i].addActionListener(this);
        chatbuttons_add[i].addActionListener(this);
        JPanel outer = new JPanel(new GridLayout(3,1));
        JPanel p = new JPanel(new GridLayout(1,2));
        outer.add(chatbuttons_enter[i]);
        p.add(chatbuttons_remove[i]);
        p.add(chatbuttons_add[i]);
        outer.add(p);
        add(outer);            
    }
}
 
Zuletzt bearbeitet von einem Moderator:

knilch

Bekanntes Mitglied
Hi,
fillList() wird nur ausgeführt wenn fillListFlag true ist. Im Thread setzt du fillListFlag auf false, dann wird fillList() ausgeführt.
Dann schreibst du, dass nach 5 sec nichts mehr passiert.
Du solltest mal analysieren, wann fillListFlag wieder auf true gesetzt, damit fillList() wieder ausgeführt werden kann.
 
Zuletzt bearbeitet:

qwert

Aktives Mitglied
Hi,

danke für deine Antwort. Aber fillListFlag wird von einem anderen Thread auf true gesetzt (und ist auch als volatile deklariert). Wenn ich eine Ausgabe in die Methode fillList() schreibe, sehe ich, dass diese auch immer wieder durchlaufen wird.
 

knilch

Bekanntes Mitglied
Hi,
Ok, dann wird die Methode also regelmässig ausgeführt.
Hast du es auch schon mit:
Java:
revalidate();
repaint();
probiert?
 
Zuletzt bearbeitet:

qwert

Aktives Mitglied
Hier ein kleines compilierbares Beispiel:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class Main extends JFrame implements ActionListener {
    JButton chatbuttons_enter[], chatbuttons_add[], chatbuttons_remove[];
    ArrayList<Adresseintrag> eintraege = new ArrayList<Adresseintrag>();
    String[] mBook;
    int [] mBookIDs;
    JButton[] ok;
    JDialog dialog;
    private volatile boolean fillListFlag = true;
    public Main() {
        
        loadAddressbook();
        fillList();
        setSize(500,500);
        setVisible(true);

        new Thread(){
            public void run() {
                for(;; ){
                    try { 
                        sleep(2000);
                    } catch(InterruptedException ix){ 
                        return;
                    }
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            if(fillListFlag) {
                                fillListFlag = false;
                                fillList();
                            }
                        }
                    });
                }
            }
       }.start();
    }
    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        for(int i=0;i<chatbuttons_enter.length;i++) {
            if(chatbuttons_enter[i] == o) {
                
            }
        }
    }
    public void loadAddressbook() {
        eintraege.clear();
        eintraege.add(new Adresseintrag("3","host"));
        mBook = new String[eintraege.size()];
        mBookIDs = new int[eintraege.size()];
        chatbuttons_enter = new JButton[eintraege.size()];
        for(int i=0;i<eintraege.size();i++) {
            mBook[i] = eintraege.get(i).name+" ("+eintraege.get(i).nummer+")";
            try {
                mBookIDs[i] = Integer.parseInt(eintraege.get(i).nummer);
            } catch(NumberFormatException err) {
                System.err.println("Fehler im Adressbuch!");
                err.printStackTrace();
            }
        }        
    }
    private synchronized void fillList() {
//        System.out.println("db.getChatParticipantNames().size() = "+db.getChatParticipantNames().size());
        getContentPane().removeAll();
        setLayout(new GridLayout(5,1));
        Vector<String> chatParticipantNames = getChatParticipantNames();
        chatbuttons_remove = new JButton[chatParticipantNames.size()];
        chatbuttons_add  = new JButton[chatParticipantNames.size()];
        chatbuttons_enter = new JButton[chatParticipantNames.size()];
        for(int i = 0; i < chatParticipantNames.size(); i++) {
            //System.out.println("cPN = "+chatParticipantNames.get(i));
            chatbuttons_enter[i] = new JButton();
            chatbuttons_remove[i] = new JButton("Diesen Chat aus der Liste verbergen");
            chatbuttons_add[i] = new JButton("Teilnehmer aus Adressbuch hinzufügen");
            if(chatParticipantNames.get(i) != null) {
                chatbuttons_enter[i].setText(chatParticipantNames.get(i));
            }
            chatbuttons_enter[i].addActionListener(this);
            chatbuttons_remove[i].addActionListener(this);
            chatbuttons_add[i].addActionListener(this);

            JPanel outer = new JPanel(new GridLayout(3,1));
            JPanel p = new JPanel(new GridLayout(1,2));
            outer.add(chatbuttons_enter[i]);
            p.add(chatbuttons_remove[i]);
            p.add(chatbuttons_add[i]);
            outer.add(p);
            add(outer);            
        }
    }
    public Vector<String> getChatParticipantNames() {
        Vector<String> cpn = new Vector<String>();
        cpn.add("Hallo");
        cpn.add("test");
        return cpn;
    }
    private class Adresseintrag {
        public String nummer;
        public String name; //Intern verwendeter Name (Alias)
        public Adresseintrag(String id, String host) {
            this.nummer = id;
        }
    }
    public static void main(String[] args) {
        new Main();
    }
}
 
Zuletzt bearbeitet von einem Moderator:

knilch

Bekanntes Mitglied
Hi,
Du deklarierst
Java:
private volatile boolean fillListFlag = true;
. private. Aber im Beispiel wird fillListFlag nur beim Start true sein. Dann immer false. Somit wird nur 1 mal updated. du sagst, dass fillListFlag von einem anderen Thread auf true gesetzt wird. Wenn fillListFlag private ist, dann geht das nur innerhalb der selben Klasse...
 

qwert

Aktives Mitglied
Ja, schon. Ich habe meine Klasse ja gekürzt, damit das Beispiel möglichst kurz ist.
Im Original gibt es noch diese Methode:
Code:
	@Override
	public void updateChatRooms() {
		fillListFlag = true;
	}
 

knilch

Bekanntes Mitglied
Hi,
Ich hab dein Beispiel mal genommen und etwas abgeändert.
Damit wird nun immer ein neuer user hinzugefügt und das Gui dann laufend updated. Vielleicht hilft dir das weiter:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main extends JFrame implements ActionListener {
    private static final long serialVersionUID = -711820085243592196L;
    
    JButton chatbuttons_enter[], chatbuttons_add[], chatbuttons_remove[];
    ArrayList<Adresseintrag> eintraege = new ArrayList<Adresseintrag>();
    String[] mBook;
    int [] mBookIDs;
    JButton[] ok;
    JDialog dialog;
    private volatile static boolean fillListFlag = true;
    private static Vector<String> cpn = new Vector<String>();

    public Main() {
        loadAddressbook();
        fillList();
        setSize(500,500);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        start();
    }
    
    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        for(int i=0;i<chatbuttons_enter.length;i++) {
            if(chatbuttons_enter[i] == o) {
                System.out.println(chatbuttons_enter[i].getText() +  ": bla");
            }
        }
    }
    
    private void start() {
        new Thread(){
            public void run() {
                for(;; ){
                    try {
                        sleep(2000);
                    } catch(InterruptedException ix){
                        return;
                    }
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            if(fillListFlag) {
                                System.out.println("update");
                                fillListFlag = false;
                                fillList();
                            }
                        }
                    });
                }
            }
        }.start();
    }
    
    
    public void loadAddressbook() {
        eintraege.clear();
        eintraege.add(new Adresseintrag("3","host"));
        mBook = new String[eintraege.size()];
        mBookIDs = new int[eintraege.size()];
        chatbuttons_enter = new JButton[eintraege.size()];
        for(int i=0;i<eintraege.size();i++) {
            mBook[i] = eintraege.get(i).name+" ("+eintraege.get(i).nummer+")";
            try {
                mBookIDs[i] = Integer.parseInt(eintraege.get(i).nummer);
            } catch(NumberFormatException err) {
                System.err.println("Fehler im Adressbuch!");
                err.printStackTrace();
            }
        }
    }
    
    private synchronized void fillList() {
        // System.out.println("db.getChatParticipantNames().size() = "+db.getChatParticipantNames().size());
        getContentPane().removeAll();
        setLayout(new GridLayout(5,1));
        Vector<String> chatParticipantNames = cpn;
        chatbuttons_remove = new JButton[chatParticipantNames.size()];
        chatbuttons_add = new JButton[chatParticipantNames.size()];
        chatbuttons_enter = new JButton[chatParticipantNames.size()];
        for(int i = 0; i < chatParticipantNames.size(); i++) {
            //System.out.println("cPN = "+chatParticipantNames.get(i));
            chatbuttons_enter[i] = new JButton();
            chatbuttons_remove[i] = new JButton("Diesen Chat aus der Liste verbergen");
            chatbuttons_add[i] = new JButton("Teilnehmer aus Adressbuch hinzufügen");
            if(chatParticipantNames.get(i) != null) {
                chatbuttons_enter[i].setText(chatParticipantNames.get(i));
            }
            chatbuttons_enter[i].addActionListener(this);
            chatbuttons_remove[i].addActionListener(this);
            chatbuttons_add[i].addActionListener(this);

            JPanel outer = new JPanel(new GridLayout(3,1));
            JPanel p = new JPanel(new GridLayout(1,2));
            outer.add(chatbuttons_enter[i]);
            p.add(chatbuttons_remove[i]);
            p.add(chatbuttons_add[i]);
            outer.add(p);
            add(outer);
            revalidate();
        }
    }
    
    
    public static void setChatParticipantNames(String name) {
        cpn.add(name);
    }
    
    private class Adresseintrag {
        public String nummer;
        public String name; //Intern verwendeter Name (Alias)
        public Adresseintrag(String id, String host) {
            this.nummer = id;
        }
    }
    
    public static void updateChatRooms() {
        fillListFlag = true;
    }
    
    public static void main(String[] args) {
        new Main();
        setChatParticipantNames("User 1");
        setChatParticipantNames("User 2");
        new Thread(){
            public void run() {
                for(;; ){
                    try {
                        updateChatRooms();
                        sleep(2000);
                        setChatParticipantNames("User ");
                    } catch(InterruptedException ix){
                        return;
                    }
                }
            }
        }.start();
        
    }
}
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Ok, hier mal mein Erklärungsversuch. Bitte beachten: Dieses Wissen stammt von meinen eigenen Erfahrungen und kann evtl. völlig falsch sein. Zumindest habe ich es mir so zusammengereimt.

Alles was mittels SwingUtilities.invokeLater() ausgeführt wird, wird auf dem EDT ausgeführt. Somit sorgt eine zeilich lange Operation für ein "Einfrieren" der Oberfläche.

Für mich ergibt sich daraus: Da die Oberfläche immer vom EDT aus verändert werden sollte, sollten diese Operationen so kurz wie möglich sein. Wie sich das in deinem Fall umsetzen lässt kann ich dir leider nicht sagen...
 

Thallius

Top Contributor
Soweit richtig. Du must deine lange Berechnung nicht mit invokeLater starten sondern du must einen Swingworker nehmen. Tutorials und Anleitungen dazu gibt es jede Mange im Netz.

Gruß

Claus
 

qwert

Aktives Mitglied
Hab's mal versucht, will aber auch nicht klappen :( :

Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingWorker;
 
@SuppressWarnings("serial")
public class Main extends JFrame implements ActionListener {
    JButton chatbuttons_enter[], chatbuttons_add[], chatbuttons_remove[];
    JButton[] ok;
    JDialog dialog;
    public Main() { 
        setSize(500,500);
        setVisible(true);
 
        new Thread(){
            public void run() {
                for(;; ){
                    try { 
                        sleep(2000);
                    } catch(InterruptedException ix){ 
                        return;
                    }
                    SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
                        Vector<String> chatParticipantNames = new Vector<String>();
                        @Override
                        public Boolean doInBackground() {
                            chatParticipantNames.add("Name1");
                            chatParticipantNames.add("Name2");
                            chatbuttons_remove = new JButton[chatParticipantNames.size()];
                            chatbuttons_add  = new JButton[chatParticipantNames.size()];
                            chatbuttons_enter = new JButton[chatParticipantNames.size()];
                            for(int i = 0; i < chatParticipantNames.size(); i++) {
//                                System.out.println("cPN = "+chatParticipantNames.get(i));
                                chatbuttons_enter[i] = new JButton();
                                chatbuttons_remove[i] = new JButton("Diesen Chat aus der Liste verbergen");
                                chatbuttons_add[i] = new JButton("Teilnehmer aus Adressbuch hinzufügen");
                                if(chatParticipantNames.get(i) != null) {
                                    chatbuttons_enter[i].setText(chatParticipantNames.get(i));
                                }
                                chatbuttons_enter[i].addActionListener(Main.this);
                                chatbuttons_remove[i].addActionListener(Main.this);
                                chatbuttons_add[i].addActionListener(Main.this);
                            }
                            System.out.println("doInBackground() => "+chatbuttons_add.length);
                            return true;
                        }

                        @Override
                        public void done() {
                            Main.this.getContentPane().removeAll();
                            Main.this.setLayout(new GridLayout(1,1));
                            JPanel panel = new JPanel(new GridLayout(chatParticipantNames.size(),1));
                            JScrollPane sp = new JScrollPane(panel);
                            try {
                                get();
                            } catch (InterruptedException | ExecutionException e) {
                                e.printStackTrace();
                            }
                            for(int i = 0; i < chatParticipantNames.size(); i++) {                
                                JPanel outer = new JPanel(new GridLayout(3,1));
                                JPanel p = new JPanel(new GridLayout(1,2));
                                outer.add(chatbuttons_enter[i]);
                                p.add(chatbuttons_remove[i]);
                                p.add(chatbuttons_add[i]);
                                outer.add(p);
                                panel.add(outer);    
                            }
                            Main.this.add(sp);
                            System.out.println("sp added");
                        }
                    };
                    worker.execute();
                }
            }
       }.start();
    }
    public void actionPerformed(ActionEvent e) {
    }
    public static void main(String[] args) {
        new Main();
    }
}

Wo ist der Fehler?
Danke nochmal :).
 
Zuletzt bearbeitet von einem Moderator:

Thallius

Top Contributor
Ich habe mir jetzt erst den Eröffnungsthread durchgelesen.

Wenn Du Änderungen am UI machst, dann ist Swingworker natürlich nicht richtig.
Du kannst aus einem zweiten Thread heraus keine Änderungen am UI machen!
Was eventuell gehen könnte ist, dass du im Hintergrund ein neues JPanel erzeugst und dieses dann im EDT Thread aktivierst. Aber das ist natürlich auch nicht wirklich sinnvoll.

Ein Swing UI ist keine Spieleoberfläche. Wenn Du da mehrfach in kurzer Zeit Änderungen dran vornehmen willst, dann wirst du wahrscheinlich scheitern.

Wie oft wird dieses Fillist denn aufgerufen?

Gruß

Claus
 

qwert

Aktives Mitglied
Es passiert folgendes: Der Benutzer klickt auf einen Button, dann wird im Hintergrund in eine Datenbank etwas eingetragen. Ein weiterer Hintergrundthread pollt die Datenbank und wenn der Eintrag da ist, wird für jeden Eintrag in der DB ein Button erstellt.
Damit die Verzögerung beim Nutzer möglichst gering ist, soll FillList so oft wie möglich aufgerufen werden. (Es können sich auch auf andere Weise Änderungen in der Datenbank ergeben.) Wenn ich nicht immer gleich die GUI update, kann es sein, dass der Benutzer auf einen Button klickt, der gar keine Funktion mehr hat, weil der entsprechende Eintrag gar nicht mehr existiert.
Ich möchte vermeiden, dass andauernd Fehlermeldungen erscheinen à la "Zwischenzeitlich hat sich was geändert, bitte das Fenster schließen und erneut öffnen".
 

Thallius

Top Contributor
Warum benutzt du keine JTable um die Daten anzuzeigen. Dort kann man auch mit einem Klick eine Aktion auslösen und da hast du auch kein Problem wenn es mal soviele Daten werden das sie nicht mehr auf das Panel passen. Da wird dann automatisch gescrollt. Den Tabellen-Inhalt kannst Du auch über einen Worker aktualisieren.

Gruß

Claus
 

qwert

Aktives Mitglied
Ja, auf die gleiche Idee bin ich kurz vor deinem Beitrag auch gekommen und es funktioniert jetzt wunderbar :).

Also danke für deine Unterstützung :).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
volcanos SpringLayout mit zusätzlichen Buttons außerhalb des SpringLayout AWT, Swing, JavaFX & SWT 33
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
M JavaFX - Bild in Jar einbinden, sodass es auch außerhalb der IDE geladen wird. AWT, Swing, JavaFX & SWT 2
B Event Handling Mausbewegung auch außerhalb eines JFrames registrieren AWT, Swing, JavaFX & SWT 2
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
T MouseMotionListener außerhalb von Frame AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
thE_29 Swing JTabbedPane Focus von Komponenten außerhalb AWT, Swing, JavaFX & SWT 10
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
J JTextArea wird nicht aktualisiert bei Zugriff von außerhalb AWT, Swing, JavaFX & SWT 2
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
H JWindow schließen bei einem Klick außerhalb der Anwendung? AWT, Swing, JavaFX & SWT 19
T erkennen ob innerhalb oder außerhalb von canvas gezeichnet AWT, Swing, JavaFX & SWT 2
conan2 getFontMetrics() außerhalb des Components AWT, Swing, JavaFX & SWT 7
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben