ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
687
687
EMPFEHLEN
-
12.09.08 14:43 #1
- Registriert seit
- May 2004
- Beiträge
- 684
Hallo,
ich habe ein kleines "Problem" bezüglich der GUI Programmierung in Swing sowie einem nebenläufigen Thread.
Das Szenario (hier etwas konstruiert) ist relativ einfach: Auf einem JFrame gibt es einen Button "Drucken". Wenn ich auf diesen Button klicke, so wird von einer sogenantnen PrintService Klasse die "print" Methode aufgerufen. Diese Methode startet einen neuen Thread, und druckt ein Dokument aus.
Nun möchte ich, dass, sobald der Benutzer auf "Drucken" geklickt hat, ein kleines Fenster erscheint, mit dem Hinweis, dass der Druck gerade in Gange sei. Sobald die "print" Methode des "PrintService" fertig ist (oder genauer: der Thread, der von der "print" Methode zum Drucken erzeugt wurde), so soll das Hinweisfenster wieder verschwinden.
Nun weiß ich, dass man per .wait() und .notify() oder seit Java 5 mit await() und signal() z.B. das Ende eines Thread signalisieren kann. Mein Problem ist nun, was mache ich in der GUI Methode, wenn der Benutzer auf "Drucken" geklickt hat. Ich kann ja den Thread nicht einfach mit .wait() anhalten, denn es handelt sich um den Event-Dispatch-Thread, das würde bedeuten, dass die GUI eingefroren ist.
Kann mir jemand sagen, wie man hier vorgeht? Ich möchte auf das Ende eines Thread innerhalb des EDT warten, dabei darf der EDT aber nicht einfrieren.
Ich würde mich über Eure Hilfe sehr freuen
Vielen Dank!
-
13.09.08 16:17 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
schau mal hier:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
/** * */ package de.tutorials; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JProgressBar; /** * @author Tom * */ public class AsynchronousUIActionExample extends JFrame { public AsynchronousUIActionExample() { super("AsynchronousUIActionExample"); setDefaultCloseOperation(EXIT_ON_CLOSE); final JButton btnPrint = new JButton("print"); btnPrint.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { btnPrint.setEnabled(false); JFrame printingWindow = new JFrame("PrintStatus " + System.currentTimeMillis()); JProgressBar progressBar = new JProgressBar(0, 100); progressBar.setStringPainted(true); printingWindow.add(progressBar); printingWindow .setLocationRelativeTo(AsynchronousUIActionExample.this); printingWindow.pack(); printingWindow.setVisible(true); for (int i = 0; i <= 100; i += 10) { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } progressBar.setValue(i); } printingWindow.dispose(); btnPrint.setEnabled(true); } }); } }); add(btnPrint, BorderLayout.CENTER); JButton btn = new JButton("Test"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "Still responsive!"); } }); add(btn, BorderLayout.SOUTH); setLocationRelativeTo(null); pack(); setVisible(true); } /** * @param args */ public static void main(String[] args) { new AsynchronousUIActionExample(); } }
Da du hier nur das enablement bzw. die Progresswerte aktualisierst brauchst du dich hier nicht mit dem EDT zu synchronisieren...
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
-
Alternativ kannst du auch den Printthread am Ende eine methode an deinem Printdialog aufrufen lassen.
Wenn du willst auch mit richtigen Events
.
There are 10 kind of people, those who understand binary and those who don't.
-
Ich würde das ganze auch mit einem SwingWorker machen, schau mal in der Java API nach oder aber http://www.galileocomputing.de/openb...654e63e848efef hier
-
Der SwingWorker scheint wirklich eine sehr schöne Geschichte zu sein.
An mir als Mac User gehen leider die meisten Neuerungen aus Java 6 vorbei, da Apple sich mit der Implementierung der JRE diesmal sehhhr viel Zeit zugesteht.There are 10 kind of people, those who understand binary and those who don't.
Ähnliche Themen
-
Warten auf Thread ende
Von MusiumInCapitiss im Forum .NET CaféAntworten: 3Letzter Beitrag: 28.09.10, 16:58 -
Pascal - warten mit Thread
Von jeipack im Forum Delphi, Kylix, PascalAntworten: 0Letzter Beitrag: 13.06.10, 13:50 -
Warten bis der Thread abgearbeitet ist ?
Von Leroux im Forum JavaAntworten: 1Letzter Beitrag: 30.10.08, 14:31 -
Anwendung auf Thread warten lassen
Von The_Maegges im Forum .NET Windows FormsAntworten: 4Letzter Beitrag: 24.07.07, 19:02 -
PROBLEM: Wie schliesse ich einen Thread welches einen Com Port überwacht.
Von Indian im Forum C/C++Antworten: 11Letzter Beitrag: 03.01.05, 10:18





Zitieren


Login





