Grafische Benutzereingabe in For-Schleife

Status
Nicht offen für weitere Antworten.

roddy

Aktives Mitglied
Hallo,

leider ist mir kein passenderer Thread-Titel eingefallen, ich hoffe das ist nicht allzu schlimm.

Ich möchte das folgende tun:

- Ich habe ein JFrame, dass eine ProgressBar und ein "Hauptfenster" sowie einige Buttons enthält.
- Klickt man einen Button, startet ein Test. Dieser Test geht per For-Schleife durch einen Array und überprüft die dort gespeicherten Daten. Immer wenn am Ende der For-Schleife i%10==0 ist, wird ein Thread aufgerufen, der die ProgressBar im JFrame nachzeichnet (das funktioniert problemlos).
- Wenn nun aber der Test einen fehlerhaften Datensatz findet, muss der User diesen korrigieren. Dafür soll in dem genannten Hauptfenster ein Panel erscheinen, das dem User erklärt, was das Problem ist und fragt, wie es gelöst werden soll (3 Möglichkeiten die auf JButtons liegen). Erst wenn die Benutzereingabe erfolgt ist (da sie die zugrundeliegenden Daten verändert) soll die For-Schleife weiterlaufen. Also for Unterbrechen, ActionEvent abwarten, for fortführen.

Ich sitze da jetzt schon den ganzen Tag dran, habe sehr viel mit Threads rumprobiert, aber komme einfach auf keine Lösung. Im Prinzip wäre ein JOptionPane die einfachste Lösung (der wartet auf eine Eingabe, dann erst geht das Programm weiter), aber es ist mir sehr wichtig, dass eben KEIN Extrafenster aufgeht, sondern die Eingabeaufforderung im bereits offenen Fenster zu sehen ist. Wenn JOptionPane das Programm blocken kann, bis eine Eingabe erfolgt ist, müsste ich es doch auch können, oder? Kann mir irgendjemand sagen, wie ich das gliedern muss? Was für Threads sollte ich erstellen, wer soll was aufrufen und überhaupt? Ich bin momentan echt am verzweifeln...
 

Illuvatar

Top Contributor
So etwas kannst du entweder mit Monitoren machen (Object#wait() / Object#notify() - schau am besten im Forum/im Javabuch/in der Insel nach einer genaueren Erklärung) oder mit den Klassen im java.util.concurrent package.
 

roddy

Aktives Mitglied
Ich implementiere das ganze so:

Code:
                                synchronized(this){
                                    pt2infopaint.run();
                                    try{
                                        wait();
                                    }
                                    catch (InterruptedException ex){

                                    }
                                
                                }

pt2infopaint.run() sorgt dafür, dass in dem Hauptfenster die entsprechenden Infos für den Benutzer hinzukommen. Beim ActionListener auf die Benutzereingabe steht dann notify().

Das führt allerdings dazu, dass das Programm einfriert, sobald dieser Punkt erreicht ist. Was mache ich da falsch?
 

roddy

Aktives Mitglied
Ich hab jetzt noch einmal einen anderen Ansatz probiert:

Code:
Class A{
public boolean 123runs = false, 456runs = false;
...
my123 = new 123(this);
my456 = new 456(this);
123runs = true;
my123.run();
my456.run();
...
}

Code:
Class 123 extends Thread{
private A daddy;
public 123(A daddy){
     this.daddy = daddy
}
...
public void run(){
     ...
     daddy.123runs = false;
     daddy.456runs = true;
     while(daddy.456runs){
          wait();
     }
     ...
}

Code:
Class 456 extends Thread{
private A daddy;
public 456(A daddy){
     this.daddy = daddy;
}
...
public void run(){
     System.out.println("456 wurde gestartet");
     while(daddy.123runs){
          wait();
     }
     // Mach was schlaues
     daddy.123runs = true;
     daddy.456runs = false;
}

Das ganze führt wieder dazu, dass das Programm einfriert sobald 123 an die Stelle kommt, wo es warten soll. Was dazu kommt: Der System.out.print in 456 erscheint gar nicht, also der Thread wird gar nicht gestartet. Wahrscheinlich weil A wartet, bis 123 fertig ist, ehe es auf 456 run() aufruft. Aber irgendwie muss es doch möglich sein, zwei Threads gleichzeitig zu starten?!?

EDIT: Wenn ich das ganze mit start() anstatt mit run() anstosse, sieht die Sache schon ganz anders aus *erleichtertsei*. Ich glaube, das könnte das Problem lösen...
 

roddy

Aktives Mitglied
Nun taucht allerdings schon das nächste Problem auf:

in 456 wird unter dem Stichwort "Mach was schlaues" auf Daddy zugegriffen und einige Komponenten via paintImmediately neu gezeichnet. Danach geht 456 wieder in die Sleep-Schleife, bis der ActionListener aus 456 die Boolschen Variablen so verändert, dass er aufhören darf zu schlafen und stirbt (weil es am Ende der run() Methode ist). Hinter dem Aufruf der beiden Threads in der Klasse A mache ich ebenfalls eine solche While-Schlaf-Schleife, weil auch dort später Dinge in meinem Container verändert werden, die nicht verändert werden dürfen solang der 123-Thread noch läuft.

Jetzt habe ich das Problem, dass das PaintImmediately (und evtl. auch alles was davor ist) nicht ausgeführt wird. Woran könnte das liegen?

EDIT: Da der Thread der in der Schlaf-Schleife in der Klasse A gestoppt wird bislang die AWT-EventQueue-0 war und ich befürchte, dass das dafür verantwortlich ist, dass paintImmediately nicht funktioniert hab ich mal einen neuen Thread erstellt, für den Teil der Klasse A der 123 und 456 aufrufen und managen soll. Allerdings heisst der seltsamerweise immernoch AWT-EventQueue-0 (habe ein Thread.currentThread.getName() vor this.sleep(1000) gestellt um nachzuschauen) und gemalt wird immernoch nichts...
 

thE_29

Top Contributor
Threads soll man auch mit start() und net mit run starten!

Wenn man start() sagt, wird soewieso die run Methode aufgerufen.. ;)
 

roddy

Aktives Mitglied
Ja, inzwischen starte ich alle Threads mit start(), aber Probleme hab ich trotzdem immernoch...
 

André Uhres

Top Contributor
Code:
/* 
* BenutzerEingabe.java 
*/ 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class BenutzerEingabe extends JFrame { 
    public BenutzerEingabe() { 
        super("Benutzereingabe in For-Schleife"); 
        initComponents(); 
        jLabel1.setVisible(false); 
        okBtn.setVisible(false); 
    } 
    private void initComponents() { 
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        setSize(560,330);
        setLocationRelativeTo(null);
        //JComponents erzeugen:
        jPanel1 = new JPanel(); 
        jProgressBar1 = new JProgressBar(); 
        jPanel2 = new JPanel(); 
        jLabel1 = new JLabel(); 
        okBtn = new JButton("OK"); 
        jPanel3 = new JPanel(); 
        testBtn = new JButton("Start Test"); 
        //Layout:
        jPanel1.setBorder(BorderFactory.createTitledBorder("Progressbar")); 
        jPanel1.add(jProgressBar1); 
        getContentPane().add(jPanel1, BorderLayout.WEST); 
        jPanel2.setBorder(BorderFactory.createTitledBorder("Hauptfenster")); 
        jPanel2.setPreferredSize(new Dimension(150, 100)); 
        jPanel2.add(jLabel1); 
        jPanel2.add(okBtn); 
        getContentPane().add(jPanel2, BorderLayout.CENTER); 
        jPanel3.setBorder(BorderFactory.createTitledBorder("Buttons")); 
        jPanel3.setPreferredSize(new Dimension(110, 100)); 
        jPanel3.add(testBtn); 
        getContentPane().add(jPanel3, BorderLayout.EAST); 
        //Listeners:
        testBtn.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent evt) { 
                testBtnActionPerformed(evt); 
            } 
        }); 
        okBtn.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent evt) { 
                okBActionPerformed(evt); 
            } 
        }); 
        
    } 
    
    private void okBActionPerformed(ActionEvent evt) { 
        System.out.println(data+" OK"); 
        ok=true; 
        jLabel1.setVisible(false); 
        okBtn.setVisible(false); 
    } 
    private String[] arr = new String[100];{ 
        for (int i = 0; i < arr.length; i++) { 
            arr[i] = "Test_"+i; 
        } 
    } 
    private void testBtnActionPerformed(ActionEvent evt) { 
        Thread thread = new Thread(new Runnable() { 
            public void run() { 
                for (index = 0; index < arr.length; index++) { 
                    if(arr[index].equalsIgnoreCase("test_13") || arr[index].equalsIgnoreCase("test_66")){ 
                        data = arr[index]; 
                        SwingUtilities.invokeLater(new Runnable() { 
                            public void run() { 
                                jLabel1.setText("Problem in: "+data); 
                                jLabel1.setVisible(true); 
                                okBtn.setVisible(true); 
                            } 
                        }); 
                        ok = false; 
                        while(!ok){ 
                            try {Thread.sleep(100);} catch (InterruptedException ex) {} 
                        } 
                    } 
                    try {Thread.sleep(100);} catch (InterruptedException ex) {} 
                    if(index %10 == 0){ 
                        SwingUtilities.invokeLater(new Runnable() { 
                            public void run() { 
                                progress = progress + 10; 
                                jProgressBar1.setValue(progress); 
                            } 
                        }); 
                    } 
                } 
                SwingUtilities.invokeLater(new Runnable() { 
                    public void run() { 
                        jLabel1.setText("Fertig"); 
                        jLabel1.setVisible(true); 
                        progress=0; 
                        jProgressBar1.setValue(progress); 
                    } 
                }); 
            } 
        }); 
        thread.start(); 
        
    } 
    public static void main(String args[]) { 
        EventQueue.invokeLater(new Runnable() { 
            public void run() { 
                new BenutzerEingabe().setVisible(true); 
            } 
        }); 
    } 
    private int index; 
    private String data ; 
    private boolean ok ; 
    private Thread thread ; 
    private int progress; 
    private JButton testBtn, okBtn; 
    private JLabel jLabel1; 
    private JPanel jPanel1, jPanel2, jPanel3; 
    private JProgressBar jProgressBar1; 
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MaxG. Swing Dynamisch grafische Objekte erzeugen AWT, Swing, JavaFX & SWT 12
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
G Grafische Oberflächen mit Java - GUI Builder oder von Hand? AWT, Swing, JavaFX & SWT 19
E Swing Grafische Oberfläche zur Ordnerauswahl AWT, Swing, JavaFX & SWT 6
S Grafische Darstellung von signalen AWT, Swing, JavaFX & SWT 2
M grafische objekte erstellen und bewegen AWT, Swing, JavaFX & SWT 4
B Grafische Anordnung der Elemente AWT, Swing, JavaFX & SWT 2
G Grafische Kalendar-Box? AWT, Swing, JavaFX & SWT 2
M grafische Objekte mit Listener versehen AWT, Swing, JavaFX & SWT 3
E Frage? Warum funktioniert die grafische Ausgabe nicht? AWT, Swing, JavaFX & SWT 4
S Grafische Oberflächen gehen nicht! AWT, Swing, JavaFX & SWT 7
M Grafische Objekte beliebig auf einer Oberfläche verschieben AWT, Swing, JavaFX & SWT 3
M Grafische Buttons in Java (Einsteiger-Frage) AWT, Swing, JavaFX & SWT 8
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
A Programmunterbrechung und warten auf Benutzereingabe AWT, Swing, JavaFX & SWT 6
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
G Schleife verlangsamen AWT, Swing, JavaFX & SWT 3
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
W fillRect() in Schleife spukt nur Fehler aus AWT, Swing, JavaFX & SWT 3
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
R MVC Observer While-Schleife AWT, Swing, JavaFX & SWT 3
L JTabbedPane mit for Schleife aufbauen AWT, Swing, JavaFX & SWT 4
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
J GridBagLayout mit Hilfe einer For-Schleife befüllen AWT, Swing, JavaFX & SWT 1
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
C SWT Tab in Schleife AWT, Swing, JavaFX & SWT 9
C Schleife auf Mausklick warten lassen AWT, Swing, JavaFX & SWT 6
S Farbverlauf in for-Schleife berechnen AWT, Swing, JavaFX & SWT 4
H Swing Komponenten per Schleife auf JFrame AWT, Swing, JavaFX & SWT 4
F JLabel mittles Schleife einbinden?? AWT, Swing, JavaFX & SWT 3
D Swing JLabels in einer Schleife aktualisieren AWT, Swing, JavaFX & SWT 2
S Problem mit JLabel (Bewegung in Schleife) AWT, Swing, JavaFX & SWT 7
D Schleife für Button AWT, Swing, JavaFX & SWT 4
R for-Schleife in Applet ausgeben AWT, Swing, JavaFX & SWT 3
H Mit for-schleife die Componenten eines Frames verändern AWT, Swing, JavaFX & SWT 5
A Jedes JTextfield einer klasse in einer foreach schleife abarbeiten AWT, Swing, JavaFX & SWT 3
R jTextField in Schleife ausfuellen AWT, Swing, JavaFX & SWT 4
I Swing repaint wird in for-Schleife aufgerufen - was passiert? AWT, Swing, JavaFX & SWT 12
M Button funktioniert nicht mehr wenn Schleife läuft AWT, Swing, JavaFX & SWT 3
R zweidim. JButton-Array in Schleife -> NullPointerExceptio AWT, Swing, JavaFX & SWT 2
S JMenu und ActionListener per Schleife erzeugen AWT, Swing, JavaFX & SWT 3
R das letzte JLabel in der Schleife will nicht an seinen Platz AWT, Swing, JavaFX & SWT 2
J ActionListener nimmt keine for()-Schleife? AWT, Swing, JavaFX & SWT 4
G For-Schleife AWT, Swing, JavaFX & SWT 4
B Deklaration von vielen Buttons mit Schleife vereinfachen? AWT, Swing, JavaFX & SWT 9
P JRadioButton in Schleife erstellen > wo liegt mein Fehler AWT, Swing, JavaFX & SWT 2
M Schleife mit Button abbrechen AWT, Swing, JavaFX & SWT 4
T JPanel in Schleife anlegen AWT, Swing, JavaFX & SWT 7
raptorrs JTextfelder werden in while-Schleife nicht aktualisiert AWT, Swing, JavaFX & SWT 5
F Einlesen von text in textArea mittels for-schleife AWT, Swing, JavaFX & SWT 3
L vermutlich Problem in meiner for-Schleife AWT, Swing, JavaFX & SWT 6
S Mehrere Buttons in einer Schleife erzeugen . AWT, Swing, JavaFX & SWT 3
G Schleife mit repaint funktioniert nicht. AWT, Swing, JavaFX & SWT 7
A JTable Schleife AWT, Swing, JavaFX & SWT 4
G while schleife - keylistener AWT, Swing, JavaFX & SWT 4
M JDialog in for-Schleife mit Komponenten bestücken AWT, Swing, JavaFX & SWT 6
S JButton über Schleife erstellen AWT, Swing, JavaFX & SWT 4
F Frame wird nicht angezeigt nach while-Schleife AWT, Swing, JavaFX & SWT 3
R Button löst Schleife aus, danach friert die GUI ein ? AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben