PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Einsteigerprojekt. Welches Thema?


Oliver_G
2006-04-13, 13:11:59
Hi,
ich muss für den Informatik-Unterricht noch etwas auf dem Niveau eines Taschenrechners programmieren, allerdings kommen mir da keine Ideen was ich machen könnte :/
Jemand ne Idee?

Gast
2006-04-13, 13:26:59
tictactoe
taschenrechner in postfix-notation
etwas übers netzwerk hin und herschicken
ping-pong

redfalcon
2006-04-13, 13:36:40
Grafisch oder auf der Konsole?
Java Anfänger oder Fortgeschritten?

Monger
2006-04-13, 13:49:30
Was für ein Umfang (Stunden)?

An deiner Stelle würde ich auf eine graphische Oberfläche so weit es geht verzichten. Du hast ja offensichtlich schon den Taschenrechner gemacht, und wie du vielleicht festgestellt hast, können die paar Knöpfe böse Zeitfresser sein.

Eine simple Client-/Serverstruktur geht relativ flott. Ich hab mal ein Beispielprogramm gesehen, wo der Server ständig "Knock Knock" Witze erzählt. Da verbringst du aber relativ viel Zeit mit der Logik und den Daten.

Ich würde vielleicht einen Server machen, der bestimmte Anfragen auswertet. Zum Beispiel indem er auf Befehl die Uhrzeit sagt, oder einen per Namen anspricht usw.

Oliver_G
2006-04-17, 13:44:36
@redfalcon: Java-Anfänger und grafisch. Und wir arbeiten mit Eclipse, falls das noch wichtig ist. Zeit hab ich noch bis nächste woche Freitag, denke ich.

Ich bin grad dabei nen Währungsrechner zusammenzubasteln :)

Hab da aber ein Problem:
if ((event.target==euro)) Bei Klick auf den Button namens 'euro'
{
eingabestring = eingabe.getText(); Eingabe-Feld wird eingelesen und in 'eingabestring' gespeichert
ergebnis = (eingabestring*(1.95583); Da weiß ich noch nicht so richtig :)
ausgabe.setText("" + ergebnis); Ergebnis kommt ins 'ausgabe'-Label
return true;
}


Wenn ich das, was in der Eingabe steht, mit einem festen Wert multiplizieren möchte, wie mach ich das dann am besten?
War da nicht noch irgendwas mit 'Double'? :D Muss ich den String noch irgendwie umwandeln? Ist ja bisher nur ne Zeichenfolge (-> Integer?). Sollte ich die Rechnung in eine neue Klasse machen?

Gruß

Monger
2006-04-17, 14:39:23
Wenn ich das, was in der Eingabe steht, mit einem festen Wert multiplizieren möchte, wie mach ich das dann am besten?
War da nicht noch irgendwas mit 'Double'? :D Muss ich den String noch irgendwie umwandeln?

Ja, genau. Ein String ist ein String, und eine Zahl ist eine Zahl. Bitte nicht die Textrepräsentation einer Zahl mit der Zahl selbst verwechseln!

double ist eine Gleitkommazahl, während int eine natürliche Zahl ist. Für Taschenrechner bietet sich also wirklich double an. Zum Umwandeln haben die Hüllklassen passende Methoden, z.B.


double meineZahl = Double.parseDouble(meinString);



Ist ja bisher nur ne Zeichenfolge (-> Integer?). Sollte ich die Rechnung in eine neue Klasse machen?
Gruß
Ein Taschenrechner ist kein kleines Projekt. Wenn du es elegant machen willst, solltest du dein Programm in wenigstens zwei Teile aufbrechen: nämlich den graphischen und den programmlogischen Teil. Der Sinn dahinter ist, dass du beim ändern deiner graphischen Oberfläche sinnvollerweise nie wieder was an deinen Rechenoperationen ändern musst. Ein Minus ist nunmal immer ein Minus, egal ob jetzt die Taste oben links oder unten rechts ist.

Oliver_G
2006-04-17, 17:06:20
So, ich komm gut vorran :) Hab nun nen schönes Währungsrechner zusammen. (Danke nochmal an Monger für die Hilfe).

Noch eine Frage: Wie kann ich die Buchstabeneingabe in ein Textfeld unterbinden? Bzw. Fehlermeldung ausspucken lassen?

Gruß

Monger
2006-04-17, 17:19:46
Noch eine Frage: Wie kann ich die Buchstabeneingabe in ein Textfeld unterbinden? Bzw. Fehlermeldung ausspucken lassen?


Das kommt natürlich darauf an, mit was für einer Grafikbibliothek du arbeitest. Ich nehme mal an du verwendest Swing. Das JTextfield hat eine Eigenschaft namens "Enabled". Einfach auf false setzen, und schon reagiert es auf keine Benutzereingaben mehr. Den dargestellten Wert kann man natürlich immer noch vom Programm aus setzen.
Alternativ kannst du natürlich auch einfach ein JLabel verwenden, das ist von Natur aus nicht editierbar.

Oliver_G
2006-04-17, 19:04:30
Das war anders gemeint :) Da ich ja einen Rechner habe, der mit Zahlen rechnet, spuckt das Programm natürlich bei Eingabe von Nicht-Zahlen (also Buchstaben und Sonderzeichen etc.) in das Eingabefeld Fehlermeldungen ohne Ende aus.
Hatte es eben mit ner Try-Catch-Exception probiert, aber die mag er irgendwie nicht :( Er meint, er hätte Syntax-Fehler an den Stellen, aber ich seh da nix falsches :|

PS:
import java.awt.*;
import java.applet.Applet;
import java.lang.Object;

Senior Sanchez
2006-04-17, 19:27:41
Das war anders gemeint :) Da ich ja einen Rechner habe, der mit Zahlen rechnet, spuckt das Programm natürlich bei Eingabe von Nicht-Zahlen (also Buchstaben und Sonderzeichen etc.) in das Eingabefeld Fehlermeldungen ohne Ende aus.
Hatte es eben mit ner Try-Catch-Exception probiert, aber die mag er irgendwie nicht :( Er meint, er hätte Syntax-Fehler an den Stellen, aber ich seh da nix falsches :|

PS:
import java.awt.*;
import java.applet.Applet;
import java.lang.Object;

Try-catch wird zum umranden von Blöcken genutzt, nicht von Methoden.
Du kannst also mittels try-catch nur innerhalb einer Methode bzw. eines Blockes Exceptions abfangen.
Methoden können dagegen Exceptions weiterleiten.

PS: Zu dieser Zeichensache. Hänge ans Textfeld ein Keylistener und lasse bei allen Eingaben folgenden Block aufrufen:


try {
double zahl = Double.parseDouble(getText());
}
catch(Exception e) {
//setze irgendeinen Text stattdessen
}


Diese Anweisung versucht den Text in ein Double zu konvertieren. Schlägt dies fehl, kann im catch-Block irgendeine Reaktion erfolgen. Funktioniert es dagegen tadellos, kannste davon ausgehen, dass das ne korrekte Zahl ist.

Gast
2006-04-17, 21:47:50
JFormattedTextField?

Senior Sanchez
2006-04-17, 23:15:26
JFormattedTextField?

Könnte man auch nehmen, hat aber auch nen paar Macken ;) Z.B. selectAll() wenn nen Formatter gesetzt ist ;)

Oliver_G
2006-04-17, 23:34:42
Aaaahh *bing* Danke Mr. Sanchez für die Hilfe :)

So siehts nun aus und es funktioniert auch ;)
public void keyReleased(KeyEvent ev)
{
try {
double zahl = Double.parseDouble(eingabe.getText());
}
catch( Exception e) {
eingabe.setText("");
System.err.println( "Nur Zahlen erlaubt!" );
}
}

public void keyTyped(KeyEvent ev) { }
public void keyPressed(KeyEvent ev) { }


Problem ist: Ich überwache nicht nur das Textfield 'eingabe', sondern auch 'kurs'. Kann alles eingeben und kriege bei 'kurs' immer die Meldung "Nur Zahlen erlaubt!", was ja auch eigentlich nachvollziehbar ist.
Wenn ich das nun wie folgt mache:
public void keyReleased(KeyEvent ev)
{
try {
double zahl1 = Double.parseDouble(eingabe.getText());
double zahl2 = Double.parseDouble(kurs.getText());
}
catch( Exception e) {
eingabe.setText("");
kurs.setText("");
System.err.println( "Nur Zahlen erlaubt!" );
}
}

public void keyTyped(KeyEvent ev) { }
public void keyPressed(KeyEvent ev) { }
Wird, egal was eingeben wird, jedesmal auf den keyrelease hin die Eingabe gelöscht. Was auch verständlich ist, da ja zeitgleich das andere TextField überwacht wird.
Was kann ich da machen? Habs auch mit zwei Catches hintereinander probiert, was aber nicht geht. Zwei Keycatcher einbauen? Oder so? :)

Gruß

Idee: Könnte erst bei dem Button-Klick-Event das Try-Catch-Ding einbauen :)
'kurs' schickt nämlich nur auf den Button-Klick von einem bestimmten Button den Inhalt weiter..

Monger
2006-04-18, 08:40:29
@Oliver_G: Du solltest natürlich zwei getrennte KeyListener einbauen. Es sind ja auch zwei getrennte Vorgänge. Ich weiß ja nicht wie du es umgesetzt hast, aber in aller Regel machst du ja eine innere Klasse, und kannst dann Instanzen dieser Klasse für jeden Button registrieren, also z.B. :


class MyKeyListenerClass implements KeyListener{

private final JTextField parent;
public MyKeyListenerClass(JTextField parent){
this.parent = parent;
}

public void keyReleased(KeyEvent e){
// ...
parent.text = "";
}

}

// Verwendung:

textfield1.addKeyListener(new MyKeyListenerClass());
textfield2.addKeyListener(new MyKeyListenerClass());



Edit: Je nachdem was du im Listener machst, muss der Listener unter Umständen wissen wer ihn aufgerufen hat. Ich mach das immer so, dass ich den Aufrufer als Parameter im Konstruktor übergebe. Ich hab das mal oben in Fett geschrieben. Wahrscheinlich gibt es eine elegantere Lösung, aber so mache ich es immer...