![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Hero
![]() |
![]() Hi!
Ich hab bei einem Projekt mehrere GUI-Funktionalitäten auf mehrere Klassen aufgeteilt. So weit, so gut, es funktioniert auch alles wies soll, allerdings sind die GUIs teilweise voneinander abhängig und ich würde das Ganze gerne in Threads packen. Sollte insoferne einfach sein, als das von einer Gui die anderen aufgerufen werden (und zwar seriell) und immer nur eine Gui gleichzeitig aktiv ist/sein sollte. Nur bin ich bislang nicht ganz dahinter gestiegen, wie genau ich das mit den Threads anlegen kann. Eigentlich sollte es ja möglich sein, daß ich eine Gui warten lasse, bis eine andere beendet ist, dann die notwendigen Daten hole/rüberspiele (get/set) und dann die 1. Gui wieder aktiv ist. Nur, wie implementier ich das am Gescheitesten? Any Tips, Links etc? thx & lg, Athropos
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π. Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre. Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\" Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\". |
![]() |
![]() |
![]() |
#2 |
Senior Member
![]() |
![]() Hi!
Mit was hast du die GUI erstellt?? SWING?? Ich kann dir mal vorweg sagen dass gui und mehrere Threads schon zeitweise extrem blöd zu lösen ist. Wenn du wirklich willst dass die anderen Frames "warten" sprich "einfrieren" wenn du was ausführst dann brauchst eigentlich keine Threads weil der vorteil von Threads ist ja dass du mehrere sachen gleichzeitig ausführen kannst. Solltest du Threads brauchen musst du jeden Thread der nebenbei passierensoll in der gui mit SwingUtil.invokeLater(myThreadFred) (hoffe dass heißt so) ausführen... hoffe habe dir ein bischen geholfen... |
![]() |
![]() |
![]() |
#3 |
Hero
![]() |
![]() Hi!
Ja, eine swinggui. Wenn ich also keine Threads brauche, wie löse ich das Problem mit dem warten dann? Konkretes Bsp: es gibt eine Terminübersicht; neue Termine lege ich mit einer anderen Klasse an (die allerdings von der Terminübersicht aufgerufen wird). Jetzt soll eben die Terminübersicht warten, bis die Termineintragung geschlossen wird und sich dann automatisch aktualisieren. Wie löse ich das Threadfrei? (und idealerweise ohne daß ich alles in ein Classfile packe?) lg
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π. Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre. Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\" Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\". |
![]() |
![]() |
![]() |
#4 |
Senior Member
![]() |
![]() Ganz einfach
Wenn du in einem ActionListener eine Aktion ausführst steht sowieso der Ganze SwingThread bis der Listener fertig ist. Also problem eins gelöst. Problem 2: Aktualisieren: ich denke mal du hast deiner Termine in ner JTable oder so. Dann schaust du einfach dass du in der 2. Klasse ne Referenz auf die Table hast und einfach im Model von der Table die fireTableDataChanged() schießt dann sollte er deine Termine lösen. |
![]() |
![]() |
![]() |
#5 |
Hero
![]() |
![]() Hi!
Danke für deine Antwort und sorry, daß ich mich länger nicht gerührt habe. @1: nachdem ich mit dem ActionListener eine externe Gui aufrufe (quasi new...) läuft die 1. Gui normal weiter, es wird nur die 2. "dazu" aufgemacht - sprich mit 1. Gui deaktivieren, 2. aufrufen und erst wenn die wieder "geschlossen" wird, läuft die 1. weiter ist leider nicht. @Termine: das ist mit einem Buttonarray gelöst (hat technische Gründe), ergo nix mit signal an den Table lg, Athropos
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π. Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre. Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\" Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\". |
![]() |
![]() |
![]() |
#6 |
Inventar
![]() Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552
|
![]() 2 einfache möglichkeiten:
In der Methode von GUI 1 die GUI 2 aufruft deaktivierst du vorher alles in GUI 1 damit nix mehr ausgeführt werden kann. Und beim Schließen von GUI2 aktivierst wiede alles und updatest die Daten. Noch einfacher: GUI 2 als modalen Diaglog öffnen (kann man beim Öffnen angeben wie das Window geöffnet werden soll, weiß jetzt aber nimmer auswendig wie) - dann ist sowieso nur noch GUI2 aktiv und sonst kann nichts mehr angeklickt werden. ![]() |
![]() |
![]() |
![]() |
#7 |
Hero
![]() |
![]() @renew: modaler dialog hats gebracht, DANKE!
![]() @all: aufgewärmt hab ich den Thread aus folgendem Grund: ich hab immer noch ein Problem mit Threads (und mit der Tatsache, daß sich danach so bequem Googeln lässt ![]() Wie dem auch sei, nachdem einige Datenbankzugriffe etwas länger dauern, hab ich mir gedacht, daß so ein Fortschrittsbalken doch bequem zu haben wäre. Testhalber hab ich 3 Klassen geschrieben und im Test funktioniert es auch brav (wobei zu sagen ist, daß es nur funzt, wenn ich mit Thread.start() arbeite, bei Thread.run() ärgerlicherweise nicht) Anbei der Code: 1) Class für den ProgressBar Code:
public class HelloLoop implements Runnable { private int pValue = 0; private JFrame frame = new JFrame("Progress Bar Trial"); private JProgressBar progress = new JProgressBar(); public void setMaximumSize(int max) { progress.setMaximum(max); } public void setActualValue(int val) { pValue = val; } public void disableProgressBar() { frame.setVisible(false); } public void enableProgressBar() { frame.setVisible(true); pValue = 0; } public void run() { progress.setPreferredSize(new Dimension(250,25)); progress.setValue(0); progress.setStringPainted(true); progress.setIndeterminate(false); frame.setLayout(new FlowLayout()); frame.add(progress); frame.pack(); while (true) { progress.setValue(pValue); try { Thread.sleep(50); } catch (InterruptedException e) {} } } } Code:
public class HelloDatabase implements Runnable { private HelloLoop pbar; private int step = 0; public void setProgressBar(HelloLoop p) { pbar = p; } public void rumbleDatabase() { pbar.setMaximumSize(variable); pbar.setActualValue(0); pbar.enableProgressBar(); //query: daten einlesen //query: neuen table anlegen //query: daten in neuen table einfügen //+jeweils erhöhung der zählvariable pbar.disableProgressBar(); } //end rumbleDatabase public void run() { while (true) { pbar.setActualValue(step); try { Thread.sleep(50); } catch (InterruptedException e) {} } } } Code:
public class HelloThreads { public static void main (String[] args) { HelloDatabase database = new HelloDatabase(); HelloLoop myProgress = new HelloLoop(); database.setProgressBar(myProgress); Thread data = new Thread (database); Thread bar = new Thread (myProgress); data.start(); bar.start(); database.rumbleDatabase(); } } Wo liegt der Fehler?
____________________________________
Einstein, Pascal and Newton are playing hide and seek. Einstein is \"it\" so he faces the wall, closes his eyes and counts to π. Pascal runs off like an idiot but Newton pulls out a piece of chalk and draws a 1m x 1m square on the ground and then stands in it\'s centre. Einstein\'s done counting and turns around and sees Newton, so he grabs him and screams \"I found Newton!\" Then Newton smirks and says, \"I\'m not Newton, I\'m Pascal\". |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|