Java Programm < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 21:22 Mi 02.07.2008 | Autor: | SusaSch |
Hallöle
Ich bin gerade dabei ein Programm mit Java zu schreiben und bin dabei auf ein paar Probleme gestoßen(Ich benutze Eclipse).
Undzwar habe ich mehrere Oberflächen. Ich frage mich nun, ob es möglich ist Daten die auf einer Oberfläche vom Benutzer eingegeben werden auf eine andere Oerfläche übertragen kann. Also z.b., wenn der benutzer in einer oberfläche eine kundennummer eingibt, diese in einem textfeld auf der anderen Oberfläche erscheint.
Zum anderen schwebt mir eine oberfläche vor zum löschen von daten, bei der wenn man auf den lösch button drückt eine andere Oberfläche aufgeht, in der nochmal nachgefragt wird, ob man sich wirklich sicher ist. Dabei ist mir wichtig, dass die hauptoberfläche mitbekommt, was welcher button (Ja oder nein) gedrückt wird, damit sie z.B. textfelder usw wieder auf Anfangswerte setzt. Aber wie geht das, das die Oberflächen so miteinander kommunizieren können? BZw geht das überhaupt?
LG Susi
|
|
|
|
Hallo,
so etwas, was du anstrebst, ist kein Problem. Du erzeugst in deinem Programm z.B. zwei JFrames, in denen du jeweils deine Bedienelemente unterbringst. Im ersten könntest du z.B. ein JTextField platzieren und es mit einem passenden ActionListener versehen. Wenn du nun dort etwas eintippst, reagiert automatisch der von dir eingestellte Listener und führt beispielweise Aktionen aus, die Elemente im zweiten JFrame beeinflussen.
Du kannst mit dem einfachsten Beispiel anfangen: Zwei JFrames mit je einem Button, der jeweils das andere JFrame schließt.
Ich weiß nicht, wie weit du mit der Programmierung bist, aber du solltest dich auf jeden Fall mit Swing (also JFrame, JPanel, ...) und dem Listener-Konzept in Java beschäftigen.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:11 Do 03.07.2008 | Autor: | SusaSch |
Hey
Ja das was du meinst ist ja kein Problem. Ich benutze Eclipse und da kann man seine Oberflächeb einfach so zusammensetzen. Meine 2 Oberflächen haben bereits Buttons und Textfelder usw. Nun möchte ich aber, das ich wenn ich auf den Button löschen drücke eine neue Oberfläche öffnet mit einem ja oder nein button > Soweit habe ich das bereits. Wenn der Benutzer jetzt aber z.b. ja drückt soll sich nicht nur das kleine fenster wieder schließen(was kein problem wäre), sonder das große fenster auch die textfelder wieder auf die anfangswerte setzt(z.b. Hier Name eingeben). Mein Problem ist es, wie ich der Hauptoberfläche vermitteln kann welcher Button auf der kleinen Oberfläche gedrückt wurde...
Und wie kann ich das realisieren? Also z.b., wenn der benutzer in einer oberfläche eine kundennummer eingibt, diese in einem textfeld auf der anderen Oberfläche erscheint.
Hab aber AWT und nicht Swing benutzt.
Vielen dank schonmal
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:29 Do 03.07.2008 | Autor: | piet.t |
Hallo,
Swing kenne ich inzwischen einigermaßen, AWT deutlich weniger und mit GUI-Buildern hatte ich noch gar nix am Hut, aber vielleicht kann ich ja doch ein paar Hinweise unterbringen...
> Nun möchte ich aber, das ich wenn ich
> auf den Button löschen drücke eine neue Oberfläche öffnet
> mit einem ja oder nein button
> Soweit habe ich das
> bereits. Wenn der Benutzer jetzt aber z.b. ja drückt soll
> sich nicht nur das kleine fenster wieder schließen(was kein
> problem wäre), sonder das große fenster auch die textfelder
> wieder auf die anfangswerte setzt(z.b. Hier Name eingeben).
> Mein Problem ist es, wie ich der Hauptoberfläche vermitteln
> kann welcher Button auf der kleinen Oberfläche gedrückt
> wurde...
Unter Swing völlig problemlos: man lässt via JOptionPane.showConfirmDialog(...) einen Bestätigungsdialog ausgeben und der Rückgabewert der Funktion sagt, welchen Button der Benutzer gedrückt hat. Allerdings blockiert die Anwendung, bis der Benutzer einen Button gedrückt hat, aber das ist in diesem Fall vielleicht sogar besser so.
Mit AWT erfordert das deutlich mehr Handarbeit. Erstmal das Fenster und die Buttons extra zusammenbasteln - aber das hast Du ja schon. Dann solltest Du einen ActionListener schreiben, der sich beim "löschen"-Button registriert und der irgend eine Möglichkeit hat, dem Hauptfenster mitzuteieln, dass es alle Felder löschen soll -im Idealfall hast Du irgendwo in Deiner Anwendung eine Methode alleFelderLoeschen() und die kannst Du dann in der actionPerformed()-Methode Deines Listeners aufrufen.
>
> Und wie kann ich das realisieren? Also z.b., wenn der
> benutzer in einer oberfläche eine kundennummer eingibt,
> diese in einem textfeld auf der anderen Oberfläche
> erscheint.
Auch hier brauchst Du wieder einen entsprechenden Listener, der am besten beide Felder "kennt". Weil Du wahrscheinlich nicht simultan zur Eingabe die Feldinhalte übertragen willst ist auch hier wahrscheinlich wieder ein Knopf im Spiel bei dem sich dieser Listener registrieren muss. Und in actionPerformed() muss dieser dann eben den Inhalt aus dem einen Feld auslesen und in das andere übertragen.
Bei dieser ganzen "Verdrahtung" der einzelnen Komponenten ist leider immer eine Menge Handarbeit angesagt, da die GUI-Builder hier leider nur wenig unterstützung anbieten können. Wie Du im Detail am besten vorgehst kann ich jetzt leider nicht sagen, denn das hängt stark davon ab, was der GUI-Builder für Code generiert. Übrigens: welchen verwendest Du eigentlich, denn Eclipse bringt ja von Haus aus keinen mit, das ist also irgend ein Plugin im Spiel....
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:34 Do 03.07.2008 | Autor: | SusaSch |
Hey
Wo kann ich denn schauen was ich da benutze in eclipse > wie das heißt?
ölg Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:06 Fr 04.07.2008 | Autor: | piet.t |
Hallo,
hmm, unter Help>About Eclipse SDK gibt es die Punkte "Feature Details" und "Plugin-Details", wo alle installierten Erweiterungen aufgelistet sind. Da ist sicher auch der GUI-Builder dabei, allerdings wird es wohl schwer, den in dem ganzen Gewühl zu finden.
Vielleicht ist es einer von denen?
Gruß
piet
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:34 Fr 04.07.2008 | Autor: | SusaSch |
hey
joa is wohl das: Visual Editor....
lg Susi
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 16:33 Sa 05.07.2008 | Autor: | SusaSch |
Hallo
Hab schon wieder einen neue frage. Das andere Problem hab ich jetzt soweit gelöst. Gibt es irgendeine möglichkeit einen actionlistener(action performed) während er die gewünschten aktionen ausführt anzuhalten. Also das man einen befehl schreibt zum anhalten und er erst wieder forfährt wenn man einen anderen schreibt?.
LG Susi
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:51 Sa 05.07.2008 | Autor: | piet.t |
> Hallo
>
> Gibt es irgendeine möglichkeit
> einen actionlistener(action performed) während er die
> gewünschten aktionen ausführt anzuhalten. Also das man
> einen befehl schreibt zum anhalten und er erst wieder
> forfährt wenn man einen anderen schreibt?.
>
Das musst Du noch etwas genauer erklären....
Nachdem ein ActionEvent geflogen kommt machst Du erst einmal einen Teil der Arbeit, dann willst Du warten. Wann soll die Programmausführung denn weitergehen? Nach einer bestimten Zeit? Oder nachdem in einem anderen Thread irgend etwas anderes passiert?
Ersteres ist ziemlich simpel: einfach Thread.sleep(xxx) aufrufen, wobei xxx die Anzahl der Millisekunden bezeichnet, die der Thread warten soll. Achtung: wenn Du das im Event-Dispatch-Thread machst, dann friert für diesen Zeitraum die komplette Anwendung ein.
Möchtest Du die zweite Alternative, dann musst Du natürlich entsprechende parallele Threads gestartet haben (denn so lange ein Thread wartet werden in ihm natürlich keine anderen Befehle mehr ausgeführt) und kannst diese dann z.B. mittels wait() und notify() verknüpfen.
Oder willst Du an dieser Stelle auf eine bestimmte Benutzeraktion warten? Dann würde ich die actionPerformed()-Methode an dieser Stelle enden lassen und den Rest der Arbeit aus dem Listener, der auf diese Benutzer-Reaktion wartet erledigen lassen.
Was soll es also sein?
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:55 Sa 05.07.2008 | Autor: | SusaSch |
hallöle
Joa also er soll theoretisch auf eine benutzeraktion (knopfdruck) auf einer anderen Oberfläche warten ....
Ist es dann besser das den listener von der anderen Oberfläche machen zu lassen?
Lg Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:48 Sa 05.07.2008 | Autor: | piet.t |
Hallo,
>
> Joa also er soll theoretisch auf eine benutzeraktion
> (knopfdruck) auf einer anderen Oberfläche warten ....
> Ist es dann besser das den listener von der anderen
> Oberfläche machen zu lassen?
>
Ein ganz klares Ja! Es ist ja so, dass die actionPerformed()-Methode des ersten Listeners vom Event-Dispatch-Thread aufgerufen wird, und wenn man in dieser Methode den Kotnrollfluss anhält (via wait() oder sleep()), dann steht die gesamte Oberfläche und der Benutzer kann gar nicht mehr auf einen Knopf drücken (bzw. klicken kann er schon, nur merkt das die Anwendung nicht mehr). D.h. wenn man wirklich innerhalb einer Methode warten will, dann muss diese in einem separaten hread gestartet werden. Weil das aber für den Anfang in der Regel zu kompliziert ist ist es wohl besser, pro Ereignis nur die Aufgaben auszuführen, die auch wirklich direkt nach diesem Ereignis kommen sollen. Alles, was nach einem weiteren Ereignis (also dem weiteren Knopfdruck) erfolgen soll wird dann erst von einem Listener auf dieses Ereignis angestoßen.
Gruß
piet
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:56 Sa 05.07.2008 | Autor: | SusaSch |
oki Danke :).
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:29 Do 10.07.2008 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|