actionListener für JButton "Step"

widad

Mitglied
Hallo Leute,
ich erstelle gerade eine GUI mit Java, und zwar mit drei Buttons Run, Halt und next. Mit Run beginnt der Thread zu laufen und Halt soll suspendiert werden.Beide laufen prima.
NextButton soll die Ausführung des Threads Step by Step durchführen.
Hat jemand eine Idee wie ich -buttonNext.addActionListener- implementieren kann.
Ich danke euch alle im Voraus.

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** verwende fuer Kommentare hier javadoc
 * @author adil
 *
 */
public class PanelAnimation extends JPanel  {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	int cols ;
	Dimension panelAnimation ;
	JTextField[] tf;
	TextfieldArray vektor ;
	JButton buttonNext ,buttonHalt, buttonRun ;
	JPanel animationButton ;
	JPanel pane;
	boolean isFlagStart;
	String algorithmus;
	Algorithm algorithm;
	Thread thread ;
	public PanelAnimation(){
		thread = null;
		isFlagStart = false;
		animationButton = new JPanel();
		animationButton.setPreferredSize(new Dimension(600,40));
		animationButton.setBorder(BorderFactory.createLineBorder(Color.black));
		pane = new JPanel();
		pane.setPreferredSize(new Dimension(600,470));
		pane.setBorder(BorderFactory.createLineBorder(Color.black));
		setLayout(new BorderLayout());
		this.cols = PanelVektor.cols;
		this.tf = new JTextField[cols];
		this.vektor = new TextfieldArray(cols);
		panelAnimation = new Dimension(600,510);
		this.setPreferredSize(panelAnimation);
		this.setBorder(BorderFactory.createLineBorder(Color.black));
		
		Dimension buttonDimension = new Dimension(90,20); 
		
		buttonNext = new JButton("next");
		buttonNext.setPreferredSize(buttonDimension);
		
		buttonHalt = new JButton("halt");
		buttonHalt.setPreferredSize(buttonDimension);
		
		
		buttonRun  = new JButton("run");
		buttonRun.setPreferredSize(buttonDimension);
		buttonRun.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(thread == null){
					thread = new Thread()
						{	public void run(){
								if (Thread.interrupted())
								   return;
								try{
									if (StartFenster.animation.get_isFlagStart()){
										if(algorithmus == "Bubblesort"){
											algorithm = new BubbleSort(algorithmus,tf,pane);
											algorithm.sort(tf);
										}
										else if(algorithmus == "Insertionsort"){
											algorithm = new InsertSort(algorithmus,tf,pane);
											algorithm.sort(tf);
										}
										else if(algorithmus == "Selectionsort"){
											algorithm = new SelectSort(algorithmus,tf,pane);
											algorithm.sort(tf);
										}
										StartFenster.animation.set_isFlagStart(false);
									}
								}
								catch (Exception ex){
									ex.printStackTrace();
								} 
								finally {
									thread = null;
								}
							}
					};	
					thread.start();
				}
				else resumeNow();
			}
		 });
		buttonHalt.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
            	suspendNow();
            }
        });
		
		buttonNext.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
            {
				
            }
		});
		
		animationButton.add(buttonNext);
		animationButton.add(buttonHalt);
		animationButton.add(buttonRun);
		
		this.add(animationButton, BorderLayout.SOUTH);
		
	}
	@SuppressWarnings("deprecation")
	private void suspendNow() {
	    if (thread != null) { // avoid NullPointerException
	      thread.suspend();
	    }
	  }
	@SuppressWarnings("deprecation")
	private void resumeNow() {
	    if (thread != null) { // avoid NullPointerException
	      thread.resume();
	    }
	  }
	@SuppressWarnings("deprecation")
	public void stopNow(){
		if(thread != null){
			thread.stop();
		}
	}
	public void setAlgorithmus(String algo){
		this.algorithmus = algo;
		
	}
	
	public void set_isFlagStart(boolean isORnot){
		this.isFlagStart = isORnot;
		
	}
	public boolean get_isFlagStart(){
		return isFlagStart;
	}
	public void remov(){
		
		pane.removeAll();
		this.revalidate();
		this.repaint();
	}
	public void ad(){
		vektor.setdata(tf);
		pane.add(vektor);
		this.add(pane , BorderLayout.CENTER);
		this.revalidate();
		this.repaint();
	}
	public void setdata(JTextField[] vektorData){
		for (int i = 0 ; i<cols ; i++){
			tf[i] = new JTextField("",3);
			tf[i].setHorizontalAlignment(JTextField.CENTER);
			tf[i].setText(vektorData[i].getText());
		}

	}
		

}
 

Marco13

Top Contributor
Dass die Methoden aus "Thread" deprecated sind, hat einen Grund.
Es gäbe IMHO ganz grob zwei Möglichkeiten, wie man das steuern könnte: Entweder, die Algorithm's müssen ein Flag bekommen wie etwa ein "boolean singleStepMode", oder der Hauptthread muss in den Algorithmen statt 'sort' eben in einer Schleife immer nur eine Methode 'doOneSortStep' aufrufen.
Welche davon schöner wäre, ist schwer zu sagen - jegliche Form von Schönheit geht dort unter irgendwelchen wild herumgereichten JTextField-Arrays unter....
 

widad

Mitglied
vielen Dank für die Antwort. Herlich gesagt hätte ich mit dem Flag es weiterimplementieren, sonst muss ich jede menge im Programm ändern, wenn ich anstatt sort() die doOneStep() implementiere.
könntest du mir sagen wo ich den Flag im Algorithm setzen kann. als beispiel hier ist ein Algorithm
Java:
import javax.swing.JPanel;
import javax.swing.JTextField;


public class BubbleSort extends Algorithm{
	
	public BubbleSort (String alg,JTextField[] tf, JPanel pane){
		super(alg, tf ,pane);
	}
	
	public void sort(JTextField[] tf) throws InterruptedException{
			BubbleHilfVariablen hilfVariablen = new BubbleHilfVariablen();
			TextfieldArray[] vektor = new TextfieldArray[5];
			boolean flagAdd = true;
			int k =0; // für die 5 vektoren
			boolean unsortiert = true;
			//String unsort;
			int lenght = PanelVektor.cols;
			
			for (int i=0 ; i<5 ; i++){
				vektor[i] = new TextfieldArray(lenght);
				}
			//setdata(tf,vektor[0]);
			setdata(tf,vektor[4]);
			//pane.add(vektor[0]);
			pane.add(hilfVariablen);
			pane.add(vektor[4]);
			
			while (unsortiert && (lenght >=1)){
				StartFenster.panelCode.selectLine(3);
				Thread.sleep(500);
				StartFenster.panelCode.selectLine(4);
				unsortiert = false;
				hilfVariablen.setInHilfVar("false", 0); //unsortiert variable
				Thread.sleep(500);
				
				for (int i = 0 ; i < lenght-1 ; i++) {
					StartFenster.panelCode.selectLine(5);
					Thread.sleep(500);
							
					
					hilfVariablen.setInHilfVar(""+lenght, 1);//lenght variabele
					hilfVariablen.setInHilfVar(""+i,2);		//i variable
					Thread.sleep(500);
					
					//hilfVariablen.setInHilfVar("", 3);
					//selectline()in JTextPane
					StartFenster.panelCode.selectLine(6);
					
					hilfVariablen.setColorNull(3);
					vektor[4].setColorNull();
					vektor[4].setColor(i);
					vektor[4].setColor_c(i+1);
					
					if(Integer.parseInt(vektor[4].getAusArray(i)) > Integer.parseInt(vektor[4].getAusArray(i+1))){
						Thread.sleep(500);
						StartFenster.panelCode.selectLine(7);
						hilfVariablen.setColor(3);
						hilfVariablen.setInHilfVar(vektor[4].getAusArray(i), 3);
						Thread.sleep(500);
						
						StartFenster.panelCode.selectLine(8);
						vektor[4].setInArray(vektor[4].getAusArray(i+1), i);
						Thread.sleep(500);
						
						StartFenster.panelCode.selectLine(9);
						vektor[4].setInArray(hilfVariablen.getAusHilfVar(3), i+1);
						
						Thread.sleep(500);
						
						if(flagAdd){
							k++;
							copyData(vektor[4],vektor[k]);
							pane.add(vektor[k]);
							pane.add(hilfVariablen);
							pane.add(vektor[4]);
							StartFenster.animation.revalidate();
							StartFenster.animation.repaint();
							if(k == 3 ){
								flagAdd = false;
							}
						}
						else {
							pane.add(vektor[4]);
							for(int j = 1 ; j<4 ; j++ ){
								copyData(vektor[j],vektor[j-1]);
							}
							
							copyData(vektor[4],vektor[3]);
						}
						
						StartFenster.panelCode.selectLine(10);
						unsortiert = true;
						hilfVariablen.setInHilfVar("true", 0); //unsortiert variable
						Thread.sleep(500);
					}
					
				}
				StartFenster.panelCode.selectLine(13);
				Thread.sleep(500);
				lenght--;
				
			}
			StartFenster.panelCode.selectLine(14);
			Thread.sleep(500);
			
			StartFenster.panelCode.selectLine(15);
			Thread.sleep(500);	
		}// end von Bubblesort()
     }

viele Grüsse
 

Marco13

Top Contributor
Hmjaa.. wie angedeutet: Das ist strukturell insgesamt jetzt nicht sooo schön.... aber wenn es nur darum geht, das so schnell wie möglich zum laufen zu kriegen... ein paar Codeschnipsel als halb-Pseudocode. Wie der "single step mode" genau gesteuert werden soll, hast du jetzt nicht gesagt. Man müßte dem Algorithmus am Anfang (also BEVOR man "sort" aufruft) sagen, dass er vor jedem Schritt warten soll, bis jemand "Next Step" klickt. Dann würde das ganz grob etwa so aussehen...:

Java:
class Algorithm
{
    private boolean singleStepMode = true; // Ggf. per setter auf 'true' gesetzt
    private boolean doStep= false;
    private Object monitor = new Object();

    public void sort(...)
    {
        ....
        while (unsortiert && (lenght >=1)) // Die "Hauptschleife": Jeder Durchlauf ist ein Schritt
        {

            // Im singleStepMode: Vor jedem Schritt warten
            if (singleStepMode)
            {
                synchronized (monitor)
                {
                    while (!doStep)
                    {
                        monitor.wait();
                    }
                }
            }


            // Hier die Sortierung wie bisher
            ...

            // Ggf. dafür sorgen, dass vor dem nächsten Schritt wieder gewartet wird...
            if (singleStepMode)
            {
                doStep = false;
            }
        }

        

    // Wird vom Button aufgerufen
    public void nextStep()
    {
        synchronized(monitor)
        {
            doStep = true;
            monitor.notify();
        }
    }

Ist nur schnell hingeschrieben, aber so grob müßt's passen...


EDIT: Je nach Algorithmus und je nachdem, was ein "Schritt" sein soll, könnte man die beiden if(singleStepMode)-Blöcke auch in eine weiter innen liegende Schleife legen (hier evtl. diese for-Schleife)
 

widad

Mitglied
hab vielen Dank, es ist genau was ich brauche. ich probiere deine Idee aus, und sage bescheid. Aber die Idee ist hervorragend.
nochmal danke
 

widad

Mitglied
jo danke , es hat geklappt .
Java:
public void synchronPanelAnimation() throws InterruptedException{
		if(stepMode){
			doStep = false;
			synchronized(monitor)
			{
				while(!doStep)  monitor.wait();
			}
		}
	}

diese Methode rufe ich sie auf , nachdem ich in JTextPane eine Zeile selktiere.
und beim Drücken auf Button next wird actionlistener aufgelöst.
Java:
buttonNext.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
            {				 
				//doStep = false;
				stepMode = true;
				resumeNow();
				synchronized(monitor){
					doStep = true;
					monitor.notify();
				}
            }
		});
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Swing ActionListener für JButton bei Drücken AWT, Swing, JavaFX & SWT 3
M ActionListener für JButton AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
D Swing ActionListener für JComboBox AWT, Swing, JavaFX & SWT 8
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
B Actionlistener für MenuItem AWT, Swing, JavaFX & SWT 19
C ActionListener für dynamisches Menü AWT, Swing, JavaFX & SWT 8
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben