Kleine Übung zu ActionListener & WindowListener

Hawky

Mitglied
Hallo,

Ich mach momentan eine kleine Übung zu Java und zwar möchte ich ein Programm schreiben, welches mehrere Buttons (sagen wir mal 3 o. 4Stück) enthält auf denen unterschiedliche Sachen stehen. Das ganze soll folgendermaßen funktionieren, ich starte mein Programm und klicke auf einen Button auf dem z.B. "Wir" steht, dieser Text ("Wir") soll dann in ein DOS-Fenster geschrieben werden.

So jetzt mein Problem, ich hab mit Action und WindowListener es soeit fertig gebracht, das er mir Buttons erstellt mit denen ich das Fenster schließen kann bzw. das Programm beende, aber das mit dem "Wir" ausgeben klappt nur zum Teil. Wenn ich das Program starte und auf den "Beenden" Button klicke schließt das Programm, so solls ja auch sein, klick ich auf den "Wir" Button schriebt er unten in den Interpreter des Programms den gewünschten Text (Wir) rein, allerdings nicht in ein DOS-Fenster, das dumme ist auch, das er dann das Programm beenet, was er aber nur bei klick auf X oder Beenden tun soll. Da kommen wir auch zum nächsten und letzten Problem, wenn ich Programm ohne Fenster schreibe laufen die logischerweise im DOS-Fenster ab, allerdings wenn mein Programm mit Fenstern startet kommt bei mir kein DOS-Fenster in das ich den Text ausgeben könnte.

Ich benutzte den javaeditor (heißt so)
javaeditor

Mein quellcode:

Hauptklasse:

Code:
import java.awt.*;

public class C16Buttons1 extends Frame {
  private Button btnBeenden = new Button ("Beenden");
  private Button Wir = new Button("Wir");
  private meinActionListener beenden = new meinActionListener();
  private meinActionListener Wir = new meinActionListener();
  private meinWindowListener close = new meinWindowListener();
  private FlowLayout center = new FlowLayout (FlowLayout.CENTER);
  // Konstruktor:
  public C16Buttons1() {
    super();
    this.setSize(500, 250);
    this.setLayout(center);
    this.addWindowListener(close);
    this.add(this.btnBeenden);
    this.btnBeenden.addActionListener(beenden);
    this.add(this.Wir);
    this.Wir.addActionListener(Wir);
    this.setVisible(true);
  }

  public static void main(String args[]) {
    C16Buttons1 f = new C16Buttons1();
  }
}

WindowListener (Damit das X rechts oben funktioniert):

Code:
import java.awt.event.*;
public class meinWindowListener extends WindowAdapter{
  public void windowClosing(WindowEvent a){
    System.exit(0);
  }
}

ActionListener (Damit alle Buttons funktionieren):

Code:
import java.awt.event.*;

public class meinActionListener implements ActionListener {
  public void actionPerformed(ActionEvent event) {
   if("Wir".equals(event.getActionCommand()))
   {
     System.out.print("Wir");
   }
   java.awt.Toolkit.getDefaultToolkit().beep();
   System.exit(0);


  }

}

Wäre echt super wenn mir da jemand helfen könnte, da ich halt noch ein Anfänger bin!
Danke :)

Grüße
Hawky
 
Das er nix in ein DOS-Fenster schreibt, liegt daran, denke ich zumindest, dass du das Programm aus der IDE heraus startest und somit zum besseren Komfort die Ausgaben an die IDE weitergeleitet werden. Startest du das Programm direkt im DOS Fenster sollten die Ausgaben auch dahin weitergeleitet werden.

Dass das Programm nach jedem Klick sich beendet liegt ganz einfach daran, dass du:

System.exit(0); in der actionPerformed Methode

aufrufst und somit jeder Klick auf ein Element, welcher mit diesem ActionListener verbunden ist unweigerlich zum Beenden des Programms führt.

;)
 
Mhm klingt logisch, jetzt ne Frage, das System.exit(0) brauch ich ja das der Beenden Button funktioniert, wie kann ich das am besten machen, dass der funktioniert und die anderen Buttons funktionieren, ohne das das Programm direkt zugeht?

Im DOS-Fenster starten? ich kenn das immer nur mit direkt kompilieren?! Aber ich glaub da muss man ne Path Variable auf die Javac.exe legen und dann im DOS-Fenster "java Programm.java" eingeben, richtig?
 
Die Lösung hast du eigentlich schon mit der if Abfrage wird abgefragt, wer die Action ausgelöst hat und in den if Block kannst du dann alle Befehle für den entsprechenden Button einsetzen.

if("Wir".equals(event.getActionCommand()))
{
System.out.print("Wir");
}

if ("Beeenden".equals.....)
{
System.exit(0);
}
 
jo das hab ich dann auch gemerkt ;)

Problem ist aber, wenn ich das so mache, und die restlichen Buttons auf die gleiche Weise hinzufüge und ich das Programm starte, funktioniert der "Wir" Button, allerdings gibt er mir 3x Wir im Interpreter aus und die anderen zwei Buttons werden völlig ignoriert!
Der beenden Button geht auch.

Jetzt nochmal mit dem strten per DOS-Fenster, wie soll das gehen, wenn ich versuch die Main Klasse zu starten meckert er rum er würde meinWindowlistener und meinActionListener nicht finden.

Ich verzweifel hier noch
 
Das sollte funktionieren .. schau dir halt den Code an.

Code:
import java.awt.*;

import java.awt.event.*;

public class MyTest extends Frame implements ActionListener {
	
  private Button btnBeenden = new Button ("Beenden");
  
  private Button Wir = new Button("Wir");
  
  private meinWindowListener close = new meinWindowListener();
  
  private FlowLayout center = new FlowLayout (FlowLayout.CENTER);
  
  // Konstruktor:
    public MyTest() {
		
    super();
	
    this.setSize(500, 250);
	
    this.setLayout(center);
	
    this.addWindowListener(close);
	
    this.add(this.btnBeenden);
	
    this.btnBeenden.addActionListener(this);
	
    this.add(this.Wir);
	
    this.Wir.addActionListener(this);
	
    this.setVisible(true);
	
	// Verwendung eines Adapters	
	this.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent e){
					System.exit(0);
				}
			});
  }

  public static void main(String args[]) {
    MyTest f = new MyTest();
  }
  
  // Klasseneigener ActionListener
  public void actionPerformed(ActionEvent e){
	  if (e.getSource() == this.Wir) System.out.println("Wir.");
	  
	  if (e.getSource() == this.btnBeenden) System.exit(0);
  }
  
}
 
Zurück