PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Definition


Nero
2005-07-13, 15:08:29
Hoi,

also der Taschenrechner ist fast fertig(Es fehlt der Löschen-Button) nun hat mein Lehrer mir den Code geschickt. Aber ich brauch kurz ne Erklärung was macht das da (e.getActionCommand().equals("+") und das da else {
if (bDisplay2 == true) {
sBetrag = tfDisplay2.getText();
tfDisplay2.setText(sBetrag +
e.getActionCommand());

Danke für eure Hilfe :)

ScottManDeath
2005-07-13, 15:27:03
Ersteres ist ein String Vergleich da bei Java der == operator prüft ob die Referenzen der Objekte gleich sind.

Das ist so wie in dem veraltetem prozeduralen C, da macht == auf nullterminierteSstrings auch nur einen Addressenvergleich und man muss um den Inhalt der Strings zu vergleichen eine Funktion aufrufen.

Zweiteres fügt an den Inhalt des Textfeldes tfDisplay2 das Rechenzeichen an, also z.B. + oder - indem es den Text des Textfeldes liest, das Zeichen anhängt und wieder zurückschreibt.



Btw, mehr Code wäre besser....

Nero
2005-07-13, 15:35:37
Ok hier mal der ganze Abschnitt

public void actionPerformed(ActionEvent e) {

String sBetrag = new String();
String sBetrag2 = new String();
String sErgebnis = new String();
double dErgebnis;
double dBetrag;
double dBetrag2;
double dErgebnis2;

if (e.getActionCommand().equals("+")
|| e.getActionCommand().equals("-")
|| e.getActionCommand().equals("/")
|| e.getActionCommand().equals("*")) {

if (bOperator == false) {
bDisplay2 = true;
sOperator = e.getActionCommand();
bOperator = true;
}

} else if (e.getActionCommand().equals("=")) {
bDisplay2 = false;

sBetrag = tfDisplay1.getText();
sBetrag2 = tfDisplay2.getText();

dBetrag = Double.parseDouble(sBetrag);
dBetrag2 = Double.parseDouble(sBetrag2);
dErgebnis = 0;

if (sOperator == "+") {
dErgebnis = dBetrag + dBetrag2;
}
if (sOperator == "-") {
dErgebnis = dBetrag - dBetrag2;
}
if (sOperator == "*") {
dErgebnis = dBetrag * dBetrag2;
}
if (sOperator == "/") {
dErgebnis = dBetrag / dBetrag2;
}

//if (e.getSource() == btErgebnis) {
tfDisplay1.setText(dErgebnis + "");
//}
} else {
if (bDisplay2 == true) {
sBetrag = tfDisplay2.getText();
tfDisplay2.setText(sBetrag +
e.getActionCommand());
} else {
sBetrag = tfDisplay1.getText();
tfDisplay1.setText(sBetrag +
e.getActionCommand());
}
}

}}

Monger
2005-07-13, 17:59:09
...Aber ich brauch kurz ne Erklärung was macht das da (e.getActionCommand().equals("+")

"e" ist ein ActionEvent. Soll heißen, ein "Ereignis" was ein Objekt feuert, um anderen Objekten mitzuteilen was gerade mit ihm passiert ist. "getActionCommand" liefert dir entsprechend das Kommando dieses Ereignisses. Das ist ein String, der vom feuernden Objekt festgelegt wurde. Weshalb der in deinem Fall gerade der Aufschrift des Objektes entsprechen soll, ist mir unklar...


und das da else {
if (bDisplay2 == true) {
sBetrag = tfDisplay2.getText();
tfDisplay2.setText(sBetrag +
e.getActionCommand());

Danke für eure Hilfe :)

Zu Deutsch:

"Wenn bDisplay2 aktiv ist, nimm das was in Display2 drin steht, füge das aktuelle Action Kommando hinten an (was in deinem Fall eine Zahl sein soll), und schreibe es zurück ins Display."

Aber ich bleibe dabei: was dein Lehrer dir da empfiehlt, ist Spaghetti Code der ganz üblen Sorte. Ich gehe mal davon aus, dass er vorher vorallem Pascal oder C/C++ geschrieben hat, weil diese Namenskonventionen gab es in Java afaik nie.

massa
2005-07-13, 18:17:40
nunja mein ehem. java-leherer würde druchdrehen, wenn er sehen würde, dass die ganze logik in einen eventhandler gestopft wurde. und ich ahne irgendwie, dass hier alles auf der gui programmiert wurde...
aber wenns läuft ;)

Nero
2005-07-13, 18:58:00
nunja mein ehem. java-leherer würde druchdrehen, wenn er sehen würde, dass die ganze logik in einen eventhandler gestopft wurde. und ich ahne irgendwie, dass hier alles auf der gui programmiert wurde...
aber wenns läuft ;)


Falls du mit GUI meinst per Drag & Drop o.A. muss ich dich enttäuschen. Das ist alles Handarbeit :( und ja es ist "etwas" verworren geworden.

Dr.Doom
2005-07-14, 10:32:29
nunja mein ehem. java-leherer würde druchdrehen, wenn er sehen würde, dass die ganze logik in einen eventhandler gestopft wurde. und ich ahne irgendwie, dass hier alles auf der gui programmiert wurde...
aber wenns läuft ;)Naja, man muss ja nicht direkt bei so kleinen Sachen mit MVC anfangen. Ich bezweifle, dass deine ersten Schritte mit Java sowas schon berücksichtigt haben. Ist auch nicht empfehlenswert und jedes Lehrbuch für Javagrundlagen schert sich um die Trennung zwischen GUI und Logik einen feuchten Dreck - und das völlig zu Recht.

Nero
2005-07-14, 10:50:30
ne andere frage. kann man bei java programmieren das wenn ich auf einen Button drücke das komplette Frame resetet wird? Also wir z.B. btReset.reset oder so

mithrandir
2005-07-14, 10:55:58
Gegenfrage: Man kann in fast jeder Sprache fast alles Programmieren, oder?

Was meinst du mit Resetten? Wenn du einfach die Textfelder leeren möchtest, einfach im ActionLister mit xyz.setText("");

bye, mith

Nero
2005-07-14, 11:05:26
Gegenfrage: Man kann in fast jeder Sprache fast alles Programmieren, oder?

Was meinst du mit Resetten? Wenn du einfach die Textfelder leeren möchtest, einfach im ActionLister mit xyz.setText("");

bye, mith


Du siehst ja oben schon ein Teil des Quellcodes. Also ich will das wenn ich auf den Deletebutton klicke (btDelete) die beiden Textfelder löschen. Allerdings will es bit bt.Delete.setText(""); nicht funktionieren.

Gruß

PS: Es gibt zwei Textfelder.

Monger
2005-07-14, 11:53:45
Du siehst ja oben schon ein Teil des Quellcodes. Also ich will das wenn ich auf den Deletebutton klicke (btDelete) die beiden Textfelder löschen. Allerdings will es bit bt.Delete.setText(""); nicht funktionieren.

Gruß

PS: Es gibt zwei Textfelder.

Du willst den Text der Textfelder löschen, nicht deines Buttons! ;)

Richtig müsste es natürlich heißen:

tfDisplay1.setText("");
tfDisplay2.setText("");

Noch ein paar Worte am Rande: Auch ein "leeres" Textfeld enthält etwas - nämlich einen leeren String. Auch eine leere Packung enthält etwas - nämlich Vakuum. Ein "nichts" in Java ist definitiv nichts - nichtmal ein Objekt. Das ist etwas verwirrend, weil es in der realen Welt nicht "nichts" gibt.

Nero
2005-07-14, 12:09:37
Du willst den Text der Textfelder löschen, nicht deines Buttons! ;)

Richtig müsste es natürlich heißen:

tfDisplay1.setText("");
tfDisplay2.setText("");

Noch ein paar Worte am Rande: Auch ein "leeres" Textfeld enthält etwas - nämlich einen leeren String. Auch eine leere Packung enthält etwas - nämlich Vakuum. Ein "nichts" in Java ist definitiv nichts - nichtmal ein Objekt. Das ist etwas verwirrend, weil es in der realen Welt nicht "nichts" gibt.


Ok aber wie führt er nun das setText aus wenn ich auf bt.Delete klicke?

HellHorse
2005-07-14, 12:34:55
http://java.sun.com/docs/books/tutorial/uiswing/learn/example2.html#handlingEvents
http://java.sun.com/docs/books/tutorial/uiswing/events/index.html
http://java.sun.com/docs/books/tutorial/uiswing/learn/example3.html
http://java.sun.com/docs/books/tutorial/uiswing/learn/index.html

massa
2005-07-14, 12:43:47
Naja, man muss ja nicht direkt bei so kleinen Sachen mit MVC anfangen. Ich bezweifle, dass deine ersten Schritte mit Java sowas schon berücksichtigt haben. Ist auch nicht empfehlenswert und jedes Lehrbuch für Javagrundlagen schert sich um die Trennung zwischen GUI und Logik einen feuchten Dreck - und das völlig zu Recht.

Klar muss man's nicht gleich übertreiben, aber eine saubere Trennung von Logik und GUI finde ich ist wichtig, und warum sollte man es nicht gleich von Grund auf lernen? Meine ersten Schritte mit Java waren völlig ohne GUI, ich hab mit kleinen Klassen angefangen und Ergebnisse auf der Konsole ausgeben lassen bzw. im Debugger angeschaut. Erst später kam dann die GUI...

Monger
2005-07-14, 13:07:20
Ok aber wie führt er nun das setText aus wenn ich auf bt.Delete klicke?

Genauso wie mit jedem anderen Button den du bis jetzt gemacht hast auch: du registrierst deine Klasse als ActionListener für den Delete Button, und prüfst dann in der "actionPerformed" Methode erstmal, ob das Event wirklich vom Delete Button kommt, und führst darauf hin das zurücksetzen der Textfelder (und deines Operators) aus.

Klar muss man's nicht gleich übertreiben, aber eine saubere Trennung von Logik und GUI finde ich ist wichtig, und warum sollte man es nicht gleich von Grund auf lernen? Meine ersten Schritte mit Java waren völlig ohne GUI, ich hab mit kleinen Klassen angefangen und Ergebnisse auf der Konsole ausgeben lassen bzw. im Debugger angeschaut. Erst später kam dann die GUI...

Klar wäre es richtig. Einerseits gleich mit EventHandlern um sich zu schmeißen, aber den sinnvollen Einsatz von Klassen zu verbieten, finde ich unverantwortlich vom Lehrer.
Gerade ein Taschenrechner ist für den Anfang überhaupt nicht trivial.

Ich hab während meinem zugegeben ziemlich knappen Studium nicht ein mal eine GUI programmiert. Ich hab mich in Swing erst in den letzten Wochen reingelesen, und ich finde: Verwenden kann man die Swing Bibliothek mit etwas Übung und Anleitung schon, aber um sie wirklich zu verstehen, muss man schon massives Fachwissen haben.
Schon deshalb sollte man Logik und GUI streng trennen, denn nur weil man von dem einen was versteht, beherrscht man das andere noch lange nicht.

Nero
2005-07-14, 14:37:59
Ok neues Problem. Und zwar habe ich es verändert und es funzt fast. Das Problem ist das ich nachdem ich den Deletebutton deklickt habe wieder was ins tfDisplay1 schreiben kann, er allerdings nach dem Klicken des Operators nicht ins zweite Fenster wechselt. Hier der Code public void actionPerformed(ActionEvent e) {

String sBetrag = new String();
String sBetrag2 = new String();
String sErgebnis = new String();
double dErgebnis;
double dBetrag;
double dBetrag2;
double dErgebnis2;

if (e.getActionCommand().equals("+")
|| e.getActionCommand().equals("-")
|| e.getActionCommand().equals("/")
|| e.getActionCommand().equals("*"))
{

if (bOperator == false) {
bDisplay2 = true;
sOperator = e.getActionCommand();
bOperator = true;
}

} else if (e.getActionCommand().equals("=")) {
bDisplay2 = false;

sBetrag = tfDisplay1.getText();
sBetrag2 = tfDisplay2.getText();

dBetrag = Double.parseDouble(sBetrag);
dBetrag2 = Double.parseDouble(sBetrag2);
dErgebnis = 0;

if (sOperator == "+") {
dErgebnis = dBetrag + dBetrag2;
}
if (sOperator == "-") {
dErgebnis = dBetrag - dBetrag2;
}
if (sOperator == "*") {
dErgebnis = dBetrag * dBetrag2;
}
if (sOperator == "/") {
dErgebnis = dBetrag / dBetrag2;
}




//if (e.getSource() == btErgebnis) {
tfDisplay1.setText(dErgebnis + "");}
//}




else {
if (bDisplay2 == true) {
sBetrag = tfDisplay2.getText();
tfDisplay2.setText(sBetrag +
e.getActionCommand());
}



else {
sBetrag = tfDisplay1.getText();
tfDisplay1.setText(sBetrag +
e.getActionCommand());


}


String cmd=e.getActionCommand();
if(cmd.equals("Delete")) {
tfDisplay1.setText("");
tfDisplay2.setText("");
}






}}}


Ok kann mir einer Helfen (am besten direkt beim Code) weil ich muss es gleich abgeben :(

Pinoccio
2005-07-14, 14:47:41
Noch ein paar Worte am Rande: Auch ein "leeres" Textfeld enthält etwas - nämlich einen leeren String. Auch eine leere Packung enthält etwas - nämlich Vakuum. Ein "nichts" in Java ist definitiv nichts - nichtmal ein Objekt. Das ist etwas verwirrend, weil es in der realen Welt nicht "nichts" gibt.Also dem muss ich wieder sprechen.
Die Kekspackung auf meinem Schreibtisch z.B. ist so etwas. Sie ist zwar vom Typ Kekspackung aber definitiv nicht da und damit im Vergleich zu einer vorhanden leeren Kekspackung was anderes.
Volle Kekspackung entspricht "blabla"
Leere Kekspackung entspricht ""
nicht vorhanden Kekspackung entspricht null.
Daß sie in der Realität nicht von einer nicht vorhanden Cola-Dose unterscheidet ist allerdings ein Nachteil dieser Analogie, denn JAVA meckert da iirc schon.

mfg Sebastian

Monger
2005-07-14, 15:27:04
Ok neues Problem. Und zwar habe ich es verändert und es funzt fast. Das Problem ist das ich nachdem ich den Deletebutton deklickt habe wieder was ins tfDisplay1 schreiben kann, er allerdings nach dem Klicken des Operators nicht ins zweite Fenster wechselt. ...

Logisch: Sobald du auf einen Operator klickst, ist der Focus auf dem Operator, und nicht auf dem Textfeld, und erst recht nicht auf dem zweiten...

Aber wenn ich dir das auch noch verrate, glaubt dir dein Lehrer nie, dass du das alleine gemacht hast.

Aber ich bin nett und geb dir noch ein paar Tipps:

Tipp 1: http://java.sun.com/j2se/1.5.0/docs/api/

Tipp 2: Es hat etwas mit deinem JTextField zu tun.

Tipp 3: Es hat etwas mit Focus zu tun.


Wenn du jetzt die richtige Methode findest und sie auch anwenden kannst, hast du auch eine gute Note verdient. Aber mach das wirklich nur, wenn alles andere schon fertig ist.

@Pinoccio: ;D

Dr.Doom
2005-07-14, 16:12:04
Klar muss man's nicht gleich übertreiben, aber eine saubere Trennung von Logik und GUI finde ich ist wichtig, und warum sollte man es nicht gleich von Grund auf lernen? Meine ersten Schritte mit Java waren völlig ohne GUI, ich hab mit kleinen Klassen angefangen und Ergebnisse auf der Konsole ausgeben lassen bzw. im Debugger angeschaut. Erst später kam dann die GUI...Natürlich ist die Trennung wichtig, aber wenn man erste Schritte mit der GUI macht, dann lohnt es sich nicht für eine Zeile Logik den Code unnötig aufzublähen bzw auf mehrere Klassen usw zu verteilen.

Gast
2005-07-14, 16:27:16
Logisch: Sobald du auf einen Operator klickst, ist der Focus auf dem Operator, und nicht auf dem Textfeld, und erst recht nicht auf dem zweiten...

Aber wenn ich dir das auch noch verrate, glaubt dir dein Lehrer nie, dass du das alleine gemacht hast.

Aber ich bin nett und geb dir noch ein paar Tipps:

Tipp 1: http://java.sun.com/j2se/1.5.0/docs/api/

Tipp 2: Es hat etwas mit deinem JTextField zu tun.

Tipp 3: Es hat etwas mit Focus zu tun.


Wenn du jetzt die richtige Methode findest und sie auch anwenden kannst, hast du auch eine gute Note verdient. Aber mach das wirklich nur, wenn alles andere schon fertig ist.

@Pinoccio: ;D


So ich bins Nero@School

Also ich hab grad die Präsentation hinter mir und der Fehler war das ich einfach bOperator = false; eingeben das war der fehler :(

Aber jetzt ist es eh vorbei.