bin Anfänger, ich will eine Eingabe aus einem JTextField in eine Variable speichern.
Beispiel:
Ich habe die Main Methode diese startet mit einem JFrame, dort befindet sich ein JTextField und ein JButton.
Nun habe ich eine Klasse "??" mit der Methode "ausfuehren()", in dieser Methode bräuchte ich nun die Eingabe von dem JTextField.
Wenn ich den JButton betätige soll die Methode "ausfuehren()" Ausgeführt werden und die Eingabe soll bearbeitet werden.
Noch zur Info:
Ich benutze Eclipse und WindowBuilder.
Also Du brauchst in Java immer eine Referenz auf die jeweiligen Instanzen. Da ich keine Ahnung habe, was Du machen willst, kann ich jetzt den Klassen keine sinnvollen Namen geben. Daher nehme ich eine Klasse Controller, welche die GUI etwas steuert und eine Klasse DoSomething für Dein ausführen.
In der main Methode solltest Du also sowas haben wie
Also wichtig ist, dass du die Instanz von DoSomething auch außerhalb erzeugen kannst, Du musst halt entscheiden, was du da brauchst.
Und in dem Beispiel bekommt doSomething direkt die Eingabe übermittelt. Es sollte vermieden werden, dass DoSomething die Implementation von Controller im Detail kennt. Aber es ginge auch folgender Konstrukt:
Der Konstruktor von DoSomething bekommt eine Instanz von Controller übergeben, welche dann gespeichert wird in einem Feld. In Controller wird dann die Instanz per new DoSomething(this); erzeugt.
Damit DoSomething nicht da JTextField kennen muss, bekommt Controller noch eine Funktion getInput() welche einfach ein return input.getText(); enthält.
Dann kann in der actionPerformed einfach doSomething() aufgerufen werden auf der Instanz von DoSomething ohne Parameter und in der Methode kann dann auf der Controller Instanz getInput aufgerufen werden.
War diese Beschreibung soweit verständlich? Auf dem Tablet ist es ansonsten schwer, ganzen Code zu schreiben, daher musste ich es mehr Beschreiben. Ich hoffe, dass es deutlich wurde, wie die jeweiligen Instanzen übergeben werden können.
Also "absoluter Neuling" stimmt nicht. Ich habe mich schon mit dem Thema Java vertraut gemacht die Basics "Aufbau von Java Programmen" und auch Paar Übungen auf der Konsole. Die GUI ist jetzt neuer für mich.
Ich suche etwas leichteres.Ich muss einfach nur die Eingabe entgegen nehmen können.
Ich habe hier mal ein Beispiel, dort nehme ich ein double entgegen in der art würde es funktionieren.Ich kriege es nur leider nicht als String hin.
Und es sollte halt mit JFrame, JTextField, JButton funktionieren. Wenn ich btnOk betätige soll tfEingabe bearbeitet werden, am besten in einer anderen Klasse.
Also die Eingabe des Double Wertes basiert ja bereits auf der Eingabe eines Strings. Daher hast Du doch bereits die Eingabe eines Strings fertig, (So Du mit JMessageDialog arbeiten willst. In dem Code ist in eingabe ja der eingegebene String.
Was den Code mit dem JFrame angeht: da hast Du doch das Fenster schon fertig, Da fehlt also nur der Action Listener auf dem Button, Also wie gezeigt einen ActionListener mit addActionListener hinzufügen. Und an den Inhalt von Deinem Eingabefeld kommt Du mit getText().
Wenn dunes in einer anderen Klasse bearbeiten willst, dann ist der Aufbau auch immer gleich:
- Instanz erzeugen und speichern. (Also z.B. In einer Instanzvariable, welche im Konstruktor gesetzt wird oder in einer lokalen Variable und die wird dann behindert Deklaration initialisiert.)
- Eine Methode auf der Instanz aufrufen, den Inhalt des Eingabefeldes kannst Du dann ja als Parameter übergeben,
(Die Variante mit der Instanzvariable habe ich ja in meiner Antwort gebracht).
Also "absoluter Neuling" stimmt nicht. Ich habe mich schon mit dem Thema Java vertraut gemacht die Basics "Aufbau von Java Programmen" und auch Paar Übungen auf der Konsole. Die GUI ist jetzt neuer für mich.
Die Lösung zum Problem hat @kneitzel schon beschrieben:
Java:
JButton btnOk =newJButton("OK");
btnOk.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent e){String eingabe = tfEingabe.getText();// mach was mit dem String}});
package application5;importjava.io.BufferedWriter;importjava.io.FileWriter;importjava.io.IOException;importjava.io.PrintWriter;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;import application5.Main;importjavafx.event.ActionEvent;importjavafx.fxml.FXML;importjavafx.scene.control.Button;importjavafx.scene.control.Label;importjavafx.scene.control.TextArea;publicclassMainWindowController{@FXMLprivateTextArea lesenText;@FXMLprivateTextArea schreibenText;@FXMLprivateButton lesebut;@FXMLprivateButton schreibbut;@FXMLprivateLabel label;@FXMLprivateButton speichbut;publicMain main;publicvoidsetMain(Main main){this.main =main;}@FXMLvoidLeseBut(ActionEvent event){
dateiSpeichern filehand =newdateiSpeichern();
filehand.speicherDatei();}@FXMLvoidSpeichBut(ActionEvent event)throws java.io.FileNotFoundException{String dateiText =schreibenText.getText();//die TextArea id für die Eingabe nennt sich schreibenText
lesenText.appendText(dateiText);//derButton Speicherbut löst das lesed aus schreibtext aus und überträgt nach Textarea LesenTextPrintWriter pWriter =null;try{
pWriter =newPrintWriter(newBufferedWriter(newFileWriter("\\C:\\test.txt")));
pWriter.println(dateiText);// das zuletzt ausgelesene dateiText wird in die Datei test.txt geschrieben}catch(IOException ioe){
ioe.printStackTrace();}finally{if(pWriter !=null){
pWriter.flush();
pWriter.close();}}}@FXMLvoidSchreiBut(ActionEvent event){System.out.print("bot gedrückt");String leo = lesenText.getText();
schreibenText.appendText(leo);}}
Also,
wie ich das jetzt verstanden habe und übernommen habe, finde ich es eigentlich recht genial.
Nur leider funktioniert es nicht?? Bekomme kein Richtig ausgegeben.
Instanzen von Klassen werden nicht mit == verglichen sondern mit equals.
eingantwort.equals(antwort) müsste da also in die if Bedingung rein.
Ein == vergleicht nur, ob die Referenzen auf die gleiche Instanz zeigen und nicht, ob der Inhalt gleich ist.
(String ist auch eine Klasse und daher sind die Variablen von diesem Typ Referenzen auf Instanzen)
@MasterShredder und gewöhne Dir am besten von vornherein die Benennungskonventionen von Java an: Namen von Typen (Klassen, Interface & Co.) in UpperCamelCase, Bezeichner für Parameter, Variablen und Methoden in lowerCamelCase.
@MasterShredder und gewöhne Dir am besten von vornherein die Benennungskonventionen von Java an: Namen von Typen (Klassen, Interface & Co.) in UpperCamelCase, Bezeichner für Parameter, Variablen und Methoden in lowerCamelCase.
OK,
habe es es mit equals versuch. Auch verstanden warum, mit equals vergleicht man Strings (auch weil nicht im gleichen Objekt)
Habe dann einen Exeption Fehler erhalten.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ausfuehrung.vergleich(ausfuehrung.java:47)
at frame$2.actionPerformed(frame.java:56)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6632)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6397)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Weiß jetzt nicht genau ob es noch die exakt gleiche ist da ich Sie erst kopiert habe als ich ein paar Änderungen gemacht habe.
Habe jetzt nur die Equals Methode auskommentiert.
Darauf hin habe ich eine Equals Methode erstellt, weiß aber auch ehrlich gesagt nicht genau ob ich das machen muss!
Darauf kam die Exepition Meldung.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ausfuehrung.vergleich(ausfuehrung.java:47)
at frame$2.actionPerformed(frame.java:56)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6632)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6397)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Also zwei Dinge:
1) Kleiner Tipp: mach alle Parameter bei Methoden final.
2) Zuweisung a = b; bedeutet, dass der Inhalt von b in a geschrieben wird.
Was bringt das alles?
Der Konstruktor bekommt zwei Parameter. Der erste Parameter ist input.
Dem Parameter Input weist du dann den Inhalt von der Instanzvariablen zu. Mit 1) meckert bei so einem Dreher der Compiler, weil Input ja final ist.