tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
687
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DarthShader DarthShader ist offline Mitglied Platin
    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!
     

  2. #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ß Tom
     
    Java 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

  3. #3
    207 207 ist offline Grünschnabel
    Registriert seit
    Sep 2008
    Beiträge
    4
    Zitat Zitat von DarthShader Beitrag anzeigen
    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.
    Vielen Dank!
    genau dafür gibt es die SwingWorker.
     

  4. #4
    Andibert Andibert ist offline Mitglied Silber
    Registriert seit
    Sep 2006
    Ort
    Hildesheim
    Beiträge
    90
    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.

  5. #5
    Avatar von Rabenherz
    Rabenherz Rabenherz ist offline Mitglied
    Registriert seit
    Jul 2008
    Ort
    Siegen
    Beiträge
    24
    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
     

  6. #6
    Andibert Andibert ist offline Mitglied Silber
    Registriert seit
    Sep 2006
    Ort
    Hildesheim
    Beiträge
    90
    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

  1. Warten auf Thread ende
    Von MusiumInCapitiss im Forum .NET Café
    Antworten: 3
    Letzter Beitrag: 28.09.10, 16:58
  2. Pascal - warten mit Thread
    Von jeipack im Forum Delphi, Kylix, Pascal
    Antworten: 0
    Letzter Beitrag: 13.06.10, 13:50
  3. Warten bis der Thread abgearbeitet ist ?
    Von Leroux im Forum Java
    Antworten: 1
    Letzter Beitrag: 30.10.08, 14:31
  4. Anwendung auf Thread warten lassen
    Von The_Maegges im Forum .NET Windows Forms
    Antworten: 4
    Letzter Beitrag: 24.07.07, 19:02
  5. Antworten: 11
    Letzter Beitrag: 03.01.05, 10:18