ActionListener versch. Buttons zuweisen => versch. Method

Status
Nicht offen für weitere Antworten.

norman

Top Contributor
hey,

habe mich schonmal bei http://www.java-forum.org/de/viewtopic.php?t=21422&highlight=button+actionlistener umgesehen, aber das hilf mir nicht sehr viel weiter.

möchte einen TR schreiben (*gähn*, ich weiß). jedenfalls hat der ja knöpfe für + - * / usw.
wie kann ich jetzt in die ActionPerfomed-methode ein switch oder so machen, damit vom button abhängt, was bei action (klick) gemacht wird?

dachte an sowas wie:

Code:
switch(name des buttons) {
case plus : addieren();break;
case minus: subtr();break;
}

aber wie kann ich den namen des buttons erfahren?
 
Jo... um das zu präzisieren 😉 ...
jeder Button erhält standardmäßig ein ActionCommand in Form des Button-textes... - das ist by the way bei allen Steuerelementen ähnlich. Alternativ kann man einzelnen Buttons per addActionCommand einen eigenen String geben (z.B. in case of Internationalisierung oder langen umständlichen Texten).
In der actionPerformed-Methode kannst du mit "evt.getActionCommand())" genau diesen String wieder auslesen und so die Herkunft differenzieren.
Ne andere Möglichkeit, die manchmal auch erforderlich sein kann, ist mit evt.getSource() die Quelle des Events herauszufinden - ein Vergleich mit == geht dann natürlich nur, wenn du von der Methode aus Zugriff auf das tatsächlich auslösende Objekt hast.

Für deine (und die meisten anderen) Zwecke ist die ActionCommand-Methode aber die sinnvollere...

hf
 
Code:
 public void actionPerformed(ActionEvent evt)
{
Object source = evt.getSource();

				

//kommata
if (source==bk)
	{	
	if (tRech.getText().indexOf('.') >0) 
		{}
		else tRech.append(".");

	}
//plus
//****************************************************************
//Wir Unterscheiden im Folgenden immer von der Rchnung mit Null,
//also der möglichkeit NACH dem ist-gleich nochmal auf PLus zu
//drücken, und dem betätigen des Buttons NACH dem eintragen einer Zahl.
//Dadurch besteht die möglichkeit ein "leeres" feld mit "null" zu
//füllen und somit die exception zu vermeiden.
//****************************************************************
if (source==bp)
		{
		if (tRech.getText().equals("code"))
		{
		hy.gimmick(); //das hier einfach ignorieren.....
		}
		else{
		if (tRech.getText().length()==0)
		{tRech.setText("0");
		hy.setH(tErg.getText()+"+");
		tErg.setText(rz.plus(tRech.getText()));
		tRech.setText("");
			
		}
		
		
		else {

		
		hy.setH(tRech.getText()+"+");
		tErg.setText(rz.plus(tRech.getText()));
		tRech.setText("");
	
		}}}
rz ist mein "rechenzentrum" in dem dann erst die eigentliche rechnung gemacht wird
hy = history in der ich sämtliche rechnungen aufliste zum nachlesen.

Wer noch ne kompliziertere art findet schreit halt :bae:

Achja kann man einen funktionierenden rechner auch mit weniger als 2000 zeilen schreiben????
 
nun ja..das ist mein stand:

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class rechner extends Applet implements ActionListener {
	
	TextField display = new TextField(15);
	
	Button b0 = new Button("0");	Button b1 = new Button("1");	Button b2 = new Button("2");	Button b3 = new Button("3");
	Button b4 = new Button("4");	Button b5 = new Button("5");	Button b6 = new Button("6");	Button b7 = new Button("7");
	Button b8 = new Button("8");	Button b9 = new Button("9");
	Button clear = new Button("Clear"); Button erg = new Button("=");
	Button plus = new Button("+");	Button minus = new Button("-");	Button multi = new Button("*");Button divi = new Button("/");
	Panel p1 = new Panel();			Panel p2 = new Panel();			Panel p3 = new Panel();
	Panel p4 = new Panel();			Panel p5 = new Panel();			Panel p6 = new Panel();
	
	
	public void actionPerformed(ActionEvent e){
		e.getActionCommand();
	}
	
	public void init(){
		setBackground(Color.LIGHT_GRAY);
		setLayout(new GridLayout(6,1,10,10));
		
		p1.add(display);
		p2.add(clear);p2.add(erg);
		p3.add(b7);p3.add(b8);p3.add(b9);p3.add(divi);
		p4.add(b4);p4.add(b5);p4.add(b6);p4.add(multi);
		p5.add(b1);p5.add(b2);p5.add(b3);p5.add(minus);
		p6.add(b0);						 p6.add(plus);		
		
		b0.addActionListener(this);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);b4.addActionListener(this);
		b5.addActionListener(this);b6.addActionListener(this);b7.addActionListener(this);b8.addActionListener(this);b9.addActionListener(this);
		clear.addActionListener(this);erg.addActionListener(this);
		
		add(p1);add(p2);add(p3);add(p4);add(p5);add(p6);
	}
	
}

sehe jetzt, dass scheinbar JButtons anstelle Buttons benutzt werden. wo liegt hier der Unterschied? habe kurz den b0 als JButton gemacht, dann kamen fehler bei b0.addActionListener(this) usw..

. o O ( schon echt mies wenn man sich nicht auskennt )
 
Code:
public void actionPerformed(ActionEvent evt)
{

Object source = evt.getSource();

//NUMMERN
if (source==bEins)
	tRech.append("1");
if (source==bZwei)
	tRech.append("2");
if (source==bDrei)
	tRech.append("3");
if (source==bVier)
	tRech.append("4");
if (source==bFunf)
	tRech.append("5");
if (source==bSex)
	tRech.append("6");
if (source==bSieb)
	tRech.append("7");
if (source==bAcht)
	tRech.append("8");
if (source==bNeun)
	tRech.append("9");
if (source==bNull)
	tRech.append("0");


So das ist 0-9, und or allem : du mußt die buttons dem actionlistener zuweisen wenn sie erstelllt wrden, also nicht im Action listener sondern im Konstruktor bzw : gleich nach dem erstellen sämtlicher butons
 
Oder so:

Code:
	/**
	 * All-in-one ActionListener
	 * 
	 *
	 */
	class MyActionListener implements ActionListener {
		public static final int BUTTON_CANCEL = 1;
		public static final int BUTTON_OK = 2;
		public static final int COMBOBOX_LOCATION = 3;
		public static final int COMBOBOX_PROCESS = 4;
		
		private int type = -1;
		
		/**
		 * 
		 * @param type
		 */
		public MyActionListener(int type) {
			this.type= type;
		}			
		
		/**
		 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
		 */
		public void actionPerformed(ActionEvent e) {			
			switch (type) {
			case BUTTON_CANCEL: 
				dispose();
				break;
				
			case BUTTON_OK:
				blabla();
				break;
				
			case COMBOBOX_LOCATION:
				blubbblubb();
				break;
				
			case COMBOBOX_PROCESS:
				dumdidum();
				break;
				
			default:
				System.println("Ich nix kennen Action: " + type);
			}
		}		
	}

Und dann halt irgendwo:

Code:
button_ok.addActionListener(new MyActionListener(MyActionListener.BUTTON_OK));
 
wo ist das problem mit arrays? probiers doch einfach mal und poste dann etwaige Fehlermeldungen, denk nur dran:
wenn du das array deklariert hast , kannst du noch nicht auf die einzelnen Buttons direkt zugreifen, da du ne Nullpointer kriegen wirst, also erst sicherstellen das die Objekte korrekt instanziert wurden.

Noch was: Wofür die ganzen Panels? Das macht es nicht gerade übersichtlicher.
 
ich dachte an soetwas wie
Code:
Button zahlen[] = new Button("0","1","2"); //...
naja..
die panels waren gedacht, um die buttons zu formatieren..aber eher nicht erfolgreich gewesen
 
mir scheints als wärst du allgemein im umgang mit arrays noch nicht allzu vertraut.

Code:
JButton zahlen[] = new JButton[10];

Danach kannst du entweder in ner Schleife o. wenn du willst auch einzeln die Objekte instanzieren.

Code:
zahlen[0] = new JButton("0");

In dem Fall wäre eine Schleife aber auch einfach und erspart dir etwas tipparbeit etc.
wie die schleife aussieht kannst mal schön selbst überlegen 😉
 
Ahhh was schreibselt der Junge da für ein Chaos das mit den Zeilenumbrüchen üben wir noch!!!

Achja ich will nur eine Frage beantworten: Kann man einen Rechner mit weniger als 2000 Zeilen schreiben ?

Assembler Programmierer : Wir denken nicht in Zeilen
Cobol Programmierer: Klar aber nicht mit Cobol
Fortran Programmierer: *pieeeeeeeeeeep*
C Programmierer: In der theorie ja!! Wie ? mit GUI? *wegrennt*
C++ Programmierer: .... geben sie mir mal das Klassendiagramm *schaut* unmöglich aber hübsch
Java Programmierer: Wo ist das Problem? TaschenRechner tr = new Taschenrechner();


Verstehst du was ich meine? Wenn du einen tollen schreibst dann gib ihn uns allen und wir werden ihn ganz sicher benutzen so funktioniert Java!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben