GUI + DB + Threads

Status
Nicht offen für weitere Antworten.
B

Booklover

Gast
Hallo allerseits!

Ich möchte in einem Swing-GUI Daten aus einer Datenbank anzeigen.

Nun habe ich zunächst den Basis-Thread (Thread 1), in dem main() läuft.
Für die GUI werkelt der Event Dispatch Thread (EDT, Thread 2).

Vorgänge, die länger dauern können (z. B. Datenbankzugriff) sollen ja nicht im EDT laufen.

Wenn ich einen Datenbankzugriff aus actionPerformed() starte, läuft der Code im EDT. Wie bringe ich ihn da jetzt raus?
Soll jetzt noch ein dritter Thread gestartet werden, oder kann das Thread 1 übernehmen?

Kopfschwirrende Grüße,
dankbar für Denkanstöße
Booklover
 
B

Booklover

Gast
Hallo!

Booklover hat gesagt.:
Wenn ich einen Datenbankzugriff aus actionPerformed() starte, läuft der Code im EDT. Wie bringe ich ihn da jetzt raus?
Soll jetzt noch ein dritter Thread gestartet werden, oder kann das Thread 1 übernehmen?

Der Präsentation entnehme ich die Antwort auf die obige Frage. Der potentiell länger laufende Code soll in einem dritten Thread ablaufen. Die Klasse SwingWorker hilft dabei.

Anm. für Noch-nicht-Profis:
Seit Java 6 ist eine Klasse SwingWorker im Standard-JDK dabei.

Wann FoxTrot sinnvoll angewendet werden kann, muss ich mir erst erarbeiten.

Beste Grüße an alle
Booklover
 

AlArenal

Top Contributor
Ich müsste mir erst erarbeiten, wann SwingWorker sinnvoller ist, denn ich war immer recht zufrieden mit Foxtrot. Natürlich funzt es nur aus dem EDT heraus, aber das dürfte bei SwingWorker kaum anders sein.
 
B

Booklover

Gast
Dann hab ich das falsch verstanden.

Ich habe geglaubt, FoxTrot ist eine Art Zusatztool zu SwingWorker.
 
G

Guest

Gast
Ich hätte dazu dann auch ne Frage.

Ich habe eine GUI, die mit einer 2. Klasse (nennen wir sie controller) kommuniziert, wobei dort die möglicherweise langsamen Datenbankabfragen erfolgen. Die Fragestellung ist, wo ich dann FoxTrot einbauen müsste.

Ein Beispiel-Listener:
Code:
public void actionPerformed(ActionEvent arg0) {
	Map result = StudentDialog.showStudentDialog(this,student);
	if(result!= null){
		try {
			controller.setStudentName(student, (String)result.get("name"));
		} catch (ControllerException e1) {				
			e1.printStackTrace();
		}
}

Die Controller-Methode:
Code:
	public boolean setStudenttName (StudentInformation student, String name)
		throws ControllerException {
			if (student.getName().equals(name)){
				return true;
			}
			else {
				con.setStudentName(student.getID(), name);
			
				if (con.getStudentName(student.getID()).equals(name)){
					student.setName(name);
					return true;
				}
			}
			throw new ControllerException("Beim setzen des Schülernamens ist ein " +
				"Fehler aufgetreten.", Level.SEVERE);		
	}
Beim Aufruf der Methode (StudentInformation)#setName(String name) passiert folgendes
Code:
public void setName (String name){
		this.name=name;
		setChanged();
		notifyObservers(this);
	}

Ich bin mir jetzt ehrlich gesagt nicht sicher, wo ich einen evtl SwingWorker, oder FoxTrot einbauen müsste.

Gerade der Part mit setName () erscheint mir problematisch, da durch dsa notify ja die GUI benachrichtig wird. In ihr sind die update-Methoden ohne die SwingUtilities (also folgendermaßen):
Code:
	public void update(Observable o, Object arg) {
		if (arg != null && arg.equals(student)){
			name.setText("  Name:  "+student.getName()); //name ist ein Label
		}
	}
Danke!
 

Leroy42

Top Contributor
AlArenal hat gesagt.:
http://www.javalobby.org/eps/galbraith-swing-2/

Eine wunderbar saubere(==leere) Seite die sich da dem
unbescholtenen Opera-Benutzer offenbart! :shock:

Und das, obwohl die JavaScript-Anweisungen extra auf Opera abfragen :(
Quelltext anzeigen hat gesagt.:
var Opera7plus = ((document.all)&&(navigator.userAgent.indexOf("Opera 7")!=-1)) ? true : false;
 
B

Booklover

Gast
Hallo!

Habe ein Testprogramm mit SwingWorker erstellt. Kritik erwünscht.

Code:
/**
 * Swing-GUI mit zwei Buttons
 * Mit jedem kann eine Zaehlung gestartet werden.
 * "Zaehlung EDT":
 *   Laeuft im EDT, GUI bleibt bis zum Ende der Zaehlung eingefroren
 * "Zaehlung Worker"
 *   Mit Hilfe von SwingWorker laeuft die Zaehlung in eigenem Thread.
 *   Das GUI bleibt benutzbar.
 *   Es koennen auch mehrere Zaehlungen parallel laufen.
 */
// Erstellt von Booklover, 2007-08
// Getestet mit Sun-Java 6 unter Ubuntu 7.04
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.concurrent.*;

public class Swing4 extends JFrame {

    private int zaehlungenWorker = 0;

    // Komponenten der Benutzeroberflaeche
    private JLabel label2 = new JLabel("Zaehlen bis:");
    private JTextField textField = new JTextField("10");
    private JButton btnCountEDT = new JButton("Zaehlung EDT");
    private JButton btnCountWorker = new JButton("Zaehlung Worker");
    private JLabel labelZaehl = new JLabel(
        "Anz. Worker-Zaehlungen: " + zaehlungenWorker);

    // Objekte, die das Interface ActionListener implementieren.
    // Argumente fuer addActionListener()
    private ActionListener listenerCountEDT = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            zaehlen();
        }
    };
    private ActionListener listenerCountWorker = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            new Worker().execute();
        }
    };
    void zaehlen() {
            System.out.println();
            System.out.println("Beginn Zaehlung");
            System.out.println("EDT? " + EventQueue.isDispatchThread());
            String s = textField.getText();
            int limit = 0;
            try {
                limit = Integer.parseInt(s);
                for (int ii = 1; ii <= limit; ii++) {
                    System.out.println(ii);
                    try {
                        TimeUnit.MILLISECONDS.sleep(200);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            } catch (NumberFormatException ex) {
                System.out.println(s + "... ungueltiges Zahlenformat");
            }
    }

    // Konstruktor
    public Swing4() {
        btnCountEDT.addActionListener(listenerCountEDT);
        btnCountWorker.addActionListener(listenerCountWorker);

        // Offen:
        // Warum sind die beiden Buttons nicht gleich breit?

        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        int distTop = 5;
        int posRow = 0;

        gbc.gridx = 0;
        gbc.gridy = posRow;
        gbc.anchor = GridBagConstraints.EAST;
        gbc.insets = new Insets(distTop, 5, 5, 5);
        add(label2, gbc);
        //
        gbc.gridx = 1;
        gbc.gridy = posRow;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(distTop, 5, 5, 5);
        add(textField, gbc);
        //
        // BUTTON EDT
        gbc.gridx = 2;
        gbc.gridy = posRow;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(distTop, 5, 5, 5);
        add(btnCountEDT, gbc);
        //
        posRow++;
        gbc.gridx = 0;
        gbc.gridy = posRow;
        gbc.anchor = GridBagConstraints.EAST;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        add(labelZaehl, gbc);
        //
        // BUTTON WORKER
        gbc.gridx = 2;
        gbc.gridy = posRow;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5, 5, 5, 5);
        add(btnCountWorker, gbc);

        setTitle(getClass().getSimpleName());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                Swing4 o = new Swing4();
            }
        });
    }

    // Innere Klasse
    // Als Typangaben void und Primitives nicht erlaubt
    class Worker extends SwingWorker<Integer, Object> {
        @Override protected Integer doInBackground() {
            zaehlen();
            return new Integer(0);
        }
        @Override protected void done() {
            zaehlungenWorker++;
            labelZaehl.setText("Anz. Worker-Zaehlungen: " + zaehlungenWorker);
        }
    }

}

Grüße Booklover
 
G

Gast

Gast
sehr schön,

dennoch ist für ein Listing vllt. ein GridLayout angebrachter als ein GridbagLayout mit Zahlreichen Constraints. Nur der lesbarkeit halber.

Das Sysout aus Zeile 51 könnte man evtl. auch noch irgendwo in der Gui unterbringen(ein Label oder Textfield).
 
B

Booklover

Gast
Gast hat gesagt.:
dennoch ist für ein Listing vllt. ein GridLayout angebrachter als ein GridbagLayout mit Zahlreichen Constraints. Nur der lesbarkeit halber.

Du hast recht. Je kürzer, desto besser.

Wollte noch nachtragen, dass ich bei Verwendung von SwingWorker nach dem (gedruckten) Inselbuch vorgegangen bin. 6. Auflage, S. 1009 bis 1011
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
G Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
N Pingen in Threads Java Basics - Anfänger-Themen 9
B Threads benutzen Java Basics - Anfänger-Themen 5
E Allgemein Verständnissfrage zum Ablauf mehrerer Threads Java Basics - Anfänger-Themen 4
S Threads erzeugen Java Basics - Anfänger-Themen 11
K Threads Nur 2 von 3 Threads funktionieren Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben