Simulation auf Knopfdruck

sticklein

Mitglied
Hallo Leute,

ich schreibe gerade an meiner Seminararbeit - leider habe ich das Problem, dass ich kaum programmieren gelernt habe......und deswegen brauche ich eure Unterstützung___ich hoffe ich bekomme sie :)

Also in meiner Seminararbeit prgrammiere ich ein Seil - das habe ich soweit auch schon geschafft, nun will ich aber die Simulation in einem Fenster haben (habe ich auch schon) und auf Knopfdruck starten bzw. stoppen lassen :/ nur habe ich da leider keine Ahnung :(
Meine Simulation läuft mit einer Zeitschleife - gibt es eine Möglichkeit, dass ihr mir einen einfachen Knopf programmiert, in den ich eine Zeitschleife reinsetzen kann - oder dass ihr mir in den kleinsten Einzelheiten erklärt, wie ich die Aktion des Knopfes programmieren kann?

Ich danke schon mal im voraus :)
Bitte helft mir.... ;(
 

Lars789852

Aktives Mitglied
Hallo,

javax.swing.JButton sollte das sein, was du suchst. Einfach deinem JFrame hinzufügen und einen ActionListener zuweisen. Bei google gibt es zig Codebeispiele für Buttons mit ActionListener.
 

Wolfgaung

Mitglied
Wieso verwendest du nicht einen jbutton, und schreibst den code in die actionperformed methode?

Java:
public class Buttonexample implements ActionListener {

JButton b = new JButton("buttonname");
b.addActionListener(this);

public void actionperformed(actionevent e){
//deine schleife hier!
}

}
 
Zuletzt bearbeitet:

sticklein

Mitglied
@Lars - mein Problem ist, dass ich eigtl durch meinen Lehrer in dem Jahr das alles lernen sollte, der dies aber nicht getan hat und deshalb komme ich auch mit den ganzen Fachbegriffen nicht klar :(

@Wolfgang - danke das werde ich mal probieren ;)
 

sticklein

Mitglied
Super :D das klappt ;)

Jetzt kann ich die Simulation mit dem Sart-Button starten, aber der Knop ist so lange gedrückt, bis die Zeitschleife am Ende ist; das heißt, ich kann die Simulation nicht mit dem Stop-Button unterbrechen :/ könnt ihr mir da noch weiterhelfen? :) das wäre super :D
 

Lars789852

Aktives Mitglied
Hallo,

das Problem ist, dass du deine Schleife im Event Dispatching Thread ausführst, da sie von der actionPerformed() aufgerufen wurde. Deswegen hängt die GUI, solange die Schleife läuft.

Abhilfe schafft da ein neuer Thread:

Java:
private Thread thread;
public void actionPerformed(ActionEvent evt) {
  thread = new Thread(new Runnable() {
    public void run() {
      // Schleife
    }
  });
  thread.start();
}

Und bei Stop:

Java:
public void actionPerformed(ActionEvent evt) {
  if(thread != null) {
    thread.interrupt();
  }
}

Der Thread muss beim Klicken auf "Start" neu erstellt werden, da ein Thread, der einmal gelaufen ist, nicht ein zweites Mal laufen kann. Beim Stop sollte man gucken, ob es den Thread überhaupt gibt, bevor man ihn unterbricht.
 

Bitler

Mitglied
Naja wäre wohl ganz sinnvoll einen Start und einen Stop Button zu implementieren und dementsprechend die zwei Methoden
 
Zuletzt bearbeitet:

Lars789852

Aktives Mitglied
Du kannst entweder zwei anonyme ActionListener machen:
Java:
startButton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    // start
  }
});
stopButton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    // stop
  }
});
Das macht den Quellcode aber schnell unübersichtlich. Du kannst auch deine Klasse, die für die GUI zuständig ist, ActionListener implementieren lassen und beide in einen ActionListener packen und das dann über die Source regeln. Dazu müssen die Buttons aber Instanzvariablen sein:
Java:
public void actionPerformed(ActionEvent evt) {
  Object source = evt.getSource();
  if(source.equals(startButton)) {
    // start
  }
  else if(source.equals(stopButton)) {
    // stop
  }
}
 
Zuletzt bearbeitet:

Wolfgaung

Mitglied
Du brauchst die actionperformed methode nur einmal, und um herauszufinden welcher button gedrückt wurde, frag innerhalb der genannten methode mit
Java:
if (e.getSource().equals(yourbuttonnameforstart)) {
Start simulation
}

Die if abfrage 2 mal stellen nur mit stopbuttonname statt start button, innerhalb der methode natürlich!
Greets
 

sticklein

Mitglied
was ist das Gegenstück zu
Java:
thread.interrupt();
?
Also dass es weiter läuft? :)
 
Zuletzt bearbeitet:

Schesam

Bekanntes Mitglied
Sry das ich Frage, aber hat euch euer lehrer überhaupt was beigebraucht? Wenn du einen thread interrupt ausführen lässt, wird die InterruptedException geworfen, die du fangen musst, damit das Programm nicht platzt. Danach ist der Thread tot, du kannst ihn also nicht mehr starten. Dazu musst du nen neuen Thread erzeugen und den dann starten.
les dir am besten Tuts dazu und probiers selber aus:
AngelikaLanger.com - Java Multithread Support - Basics - Angelika Langer Training/Consulting
GUI-Programmierung
 
Zuletzt bearbeitet:

programmierer12

Bekanntes Mitglied
Eine Aktion kannst du deinem Knopf ganz einfach mit
Java:
buttonID.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
	                             // Hier musst du dann deine Aktion einfügen
				
			}
		});
statt buttonID musst du den Bezeichner deines Button nehmen.

MFG
programmierer12
 

sticklein

Mitglied
Sry das ich Frage, aber hat euch euer lehrer überhaupt was beigebraucht?
Wenn du es genau wissen willst :noe: .....und das ist mein Problem ;( deswegen muss ich mich so durchwurschteln - und es bleibt mir nichts anderes übrig :bahnhof: weil ich kann nicht schnell mal 1 oder 2 oder nochmehr Semester Informatik nachlernen :eek:

Wenn du einen thread interrupt ausführen lässt, ..... danach ist der Thread tot, du kannst ihn also nicht mehr starten.
ok danke dann muss versuche ich es anders :)
ein bischen was kann ich schon :oops:
 
Zuletzt bearbeitet:

sticklein

Mitglied
Ich bin wieder weitergekommen, nun schaffe ich es aber leider immer noch nicht, des Thread so zu stoppen, dass ich ihn danach wieder weiterlaufen lassen kann. (also ohne interrupt)

wie kann ich das noch machen?
 

DrZoidberg

Top Contributor
Es gibt da noch eine einfachere Möglichkeit. Ich habe mal Wolfgaung's Beispiel etwas abgeändert.

Java:
public class Buttonexample implements ActionListener {
    volatile boolean isRunning = false;
     
    public void actionPerformed(ActionEvent e){
        isRunning = !isRunning;
    }
    
    public void start() {
        while(true) {
            if(!isRunning) {
                try {
                    Thread.sleep(100);
                } catch(InterruptedException e) {
                }
            } else {
                //nächste Iteration der Zeitschleife
                System.out.println("Simulation laeuft");
                
                //Dieses Thread.sleep kannst du entfernen
                //um die Geschwindigkeit auf maximum zu stellen
                try {
                    Thread.sleep(100);
                } catch(InterruptedException e) {
                }
            }
        }
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Buttonexample example = new Buttonexample();
        JButton b = new JButton("start/stop");
        b.addActionListener(example);
        frame.add(b);
        frame.pack();
        frame.setVisible(true);
        example.start();
    }
}
 

sticklein

Mitglied
Irgendwie bekomme ich das nicht hin :/

DrZoidberg wie kann ich denn das auf die Art und Weise programmiern:

Java:
stopbutton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {					
				//Hier der Befehl
			}
		});

Geht das?
 

Gucky

Top Contributor
Mit welchem SDK schreibst du denn? Eclipse zum Beispiel bietet einen GUI Editor schon von sich aus an und einen sehr guten gibt es als Plugin kostenlos. Den WindowBuilderPro (Schreibweise ähnlich). Damit kannst du die GUI Elemente einfach in dein Frame ziehen, das Element rechtsklicken und dann einen Listener hinzufügen. Dann klickst du dein Element an, gehst auf die Registerkarte Code und der Editor springt automatisch zu dem Element im Code der GUI.
 

MrClave

Bekanntes Mitglied
Wenn du es genau wissen willst :noe: .....und das ist mein Problem ;( deswegen muss ich mich so durchwurschteln - und es bleibt mir nichts anderes übrig :bahnhof: weil ich kann nicht schnell mal 1 oder 2 oder nochmehr Semester Informatik nachlernen :eek:

Offtopic:
Programmieren kann man innerhalb weniger Wochen lernen. Besonders Java.
Ich selbst habe mir programmieren mit Java innerhalb der Sommerferien beigebracht.
Der Code war natürlich weit entfernt von professionellem Design, aber das Grundgerüst sollte man schnell zum stehen bekommen.


Da deine Kenntnisse leider sehr gering erscheinen, halte ich es nicht für sinnvoll, jetzt noch mehr Code zu posten.
Daher nenne ich dir einfach mal einen YouTuber, der sowohl pädagogisch, als auch fachlich einwandfrei ist: Derek Banas. (ggf. Brotcrunsher noch)

Die gehen alle Java Basics durch + viel extra.
Nachdem du dir die Swing-Serie angeschaut hast, wirst du (hoffentlich) keine Probleme mehr haben.
Und wenn du dich ein wenig hineinversetzt, wird's schnell *klick* machen.
 

Gucky

Top Contributor
Ok. Bei meinem letzten Beitrag ist schlimm was schief gelaufen. :D Der hätte eigentlich wesentlich früher stehen sollen. :D

Auf die Gefahr hin, dich jetzt noch weiter zu verwirren. Gibt es nicht noch die Möglichkeit einen ToggleButton zu verwenden? Der Thread fragt immer nach, ob der Button getogglet ist, wenn er es ist, dann macht er, was er machen will und wenn nicht, dann fragt er einfach nur immer wieder? Beim ersten drücken wird ein nullcheck der Instanzvariable des Threads gemacht und wenn diese null ist, wird der Thread gestartet.
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Rechte Maustaste in den Beans auf deinen Button. Dann nach EventListener Punkt suchen und dann auf ActionPerformed klicken. Dann einfach auf Bestätigen.
 

sticklein

Mitglied
"ActionPerformed" habe ich drin, aber ich weiß nicht, wie ich das programmieren soll, was in "ActionPerformed" rein soll, damit ich den thread stoppen kann.
 

Gucky

Top Contributor
In deiner Threadklasse gibt es eine Methode public void run(){ }. In dieser ist die while-Schleife while(isInterrupted()){ }. In diese Schleife tust du eine if-Abfrage if(toggleButton.isSelected()){ }. In diese if-Abfrage tust du die Logik rein.
toggleButton ist die frei benennbare Instanzvariable des JToggleButtons.
In den ActionListener muss nur noch der nullcheck rein. Also:

if(THREAD==null){
THREAD=new Simulationsthread();
THREAD.start()
}

THREAD ist die frei benennbare Instanzvariable des Threads.

Aber für den JToggleButton brauchst du, glaube ich, einen ItemStateChange Listener. Ebenfalls zu finden mit genanntem Weg.


Bei einem ganz normalen Button musst du in die if-Abfrage von oben eine Abfrage if(weiterlaufen) { } machen. weiterlaufen ist eine boolean Variable. In den ActionPerformed kommt dann weiterlaufen=!weiterlaufen;
Damit wird weiterlaufen "umgedreht", unabhängig, was drin steht.
 
Zuletzt bearbeitet:

Wolfgaung

Mitglied
ich finde leider die möglichkeit des "danke sagens" nicht, vielleicht schreibt mir jemand wie das geht, dann bekommt ihr auch alle ein danke!!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
B Scanner-If/else kleine Abhebungs-Simulation Java Basics - Anfänger-Themen 3
W Cache Simulation Java Basics - Anfänger-Themen 3
L Ampel-Simulation Java Basics - Anfänger-Themen 20
CT9288 Kleine Simulation programmieren, denkanstöße erbeten Java Basics - Anfänger-Themen 19
D Erste Schritte Jäger-Beute Simulation Java Basics - Anfänger-Themen 19
M Simulation - Algorithmus Java Basics - Anfänger-Themen 3
L Maus Click Simulation Java Basics - Anfänger-Themen 5
D Simulation von Geburt/Tod und "richtige" Erkennung eines Hindernisses Java Basics - Anfänger-Themen 7
G menü in simulation Java Basics - Anfänger-Themen 3
maddin86 Simulation Wettrennen mit diversen Fahrzeugen Java Basics - Anfänger-Themen 9
X Monte Carlo Simulation (integral) Java Basics - Anfänger-Themen 4
frau-u Simulation eines Fernsehers Java Basics - Anfänger-Themen 4
M BufferedReader neue Zeile nach Knopfdruck Java Basics - Anfänger-Themen 9
E Knopfdruck neues Fenster öffnen Java Basics - Anfänger-Themen 5
L Verschiedene Bilder per Knopfdruck anzeigen lassen Java Basics - Anfänger-Themen 17
S Datenbank auf Knopfdruck abfragen Java Basics - Anfänger-Themen 8
Dechasa Per Knopfdruck Objekte erstellen Java Basics - Anfänger-Themen 4
L Fenster auf Knopfdruck Java Basics - Anfänger-Themen 3
L Methode per Knopfdruck beenden Java Basics - Anfänger-Themen 3
S Neues Fenster auf Knopfdruck Java Basics - Anfänger-Themen 12
R Icon auf JLabel nach Knopfdruck ändern Java Basics - Anfänger-Themen 20
D Objekte auf Knopfdruck in Arraylist erzeugen Java Basics - Anfänger-Themen 2
J Auf Knopfdruck Java Basics - Anfänger-Themen 9
C verschiedene Label auf Knopfdruck abrufen Java Basics - Anfänger-Themen 4
B Button Text auf Knopfdruck verändern Java Basics - Anfänger-Themen 3
F Applet: mehrere Listenelemente nach Knopfdruck ausgeben Java Basics - Anfänger-Themen 2
S Linie ausgeben, die sich auf Knopfdruck verlängert Java Basics - Anfänger-Themen 2
C zweites Panel auf Knopfdruck anzeigen Java Basics - Anfänger-Themen 2
S Neues Fenster/Panel nach Knopfdruck Java Basics - Anfänger-Themen 2
A Linie zeichnen per Knopfdruck --> Fehler Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben