Ich habe eine Frage.(Wie das in Foren meistens so ist)
In einer Klasse habe ich ein JFrame, einen Button und ein TextField kreiert.
Nun möchte ich in einer separaten Klasse das System auf Knopfdruck auslesen lassen, was im TextField steht. Er kennt aber natürlich die Variable nicht mehr.
Wie kann ich diese dort hin "transportieren"?
Aha soweit ich das jetzt verstanden habe muss ich extends benutzen.
Hätte man auch drauf kommen können.
Aber meine Klasse erbt schon von einer anderen.
Wie kann ich 2 Klassen an eine vererben?
Mir ist soeben aufgefallen das besagte Lösung leider nicht funktioniert, da die zweite Klasseein Thread ist und Socket als Paramenter erwartet. Glaube ich zumindest...
Es hilft leider nichts:
Hier der Quellcode.
Klasse Kleiner Server
Java:
importjava.net.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;publicclassKleinerServer{ServerSocket server =newServerSocket(1234);staticButton b1;staticString str;staticPrintWriter p;staticServerThread st;staticTextField tf;KleinerServer()throwsIOException{while(true){Socket client = server.accept();
st =newServerThread(client);}}publicstaticvoid main (String[] args){Frame f =newFrame();
f.setLayout(newFlowLayout());
b1 =newButton("GetText");
tf =newTextField();
tf.setPreferredSize(newDimension(80,30));
f.add(b1);
f.add(tf);ActionListener al =newActionListener(){publicvoidactionPerformed(ActionEvent ae ){
st.start();}};
b1.addActionListener( al );
f.pack();
f.setVisible(true);try{@SuppressWarnings("unused")KleinerServer server =newKleinerServer();}catch(IOException e){System.out.print(e);}}}
Ich will den Inhalt des TextFields tf rausschicken aber erst wenn auf den Button geklickt wird.
Bitte um Entschuldigung für die vergeudete Zeit der Antwortschreiber.
Ist schwierig, da Dir noch einiges an Grundlagenkenntnis fehlt. Und wenn daraus ein Chat werden soll, musst Du Dich noch mit einigen Grundlagen auseinandersetzen.
Wie in dem anderen Thread bereits gesagt, müsstest Du Dich zunächst mal mit dem Thema Threads auseinandersetzen. Das Lesen und schreiben muss sowohl auf Serverseite als auch beim Clients in jeweils unabhängigen Threads laufen.
Um den Text eines Textfeldes auf Knopfdruck zu versenden, muss man eigentlich nur den Text auslesen und per z.B. println(...) auf den Ausgabestrom schreiben.
Dazu benötigt man aber das richtige Grundgerüst und das gibt Dein Code nicht her.
Durchlaufe doch mal Deinen Code gedanklich, dann wirst Du feststellen, dass das keinen Sinn macht.
Hier mal eine ganz simple Demo der Server kann nur mit einem Client gleichzeitig kommunizieren und antwortet nur mit dem was der Client gesendet hat. Über die Konsoleneingabe kann man über den Client Nachrichten an den Server schicken.
Java:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.ServerSocket;importjava.net.Socket;importjava.net.UnknownHostException;importjava.util.Scanner;publicclassClientServerDemo{privateint port =9999;publicstaticvoidmain(String[] s){newClientServerDemo();}publicClientServerDemo(){newThread(newRunnable(){publicvoidrun(){newServer();}}).start();try{Thread.sleep(1000);}catch(InterruptedException e){
e.printStackTrace();}newClient();System.out.println("ready for sending...");System.out.println("type message for server:");}classServer{privatePrintWriter writer;publicServer(){try{ServerSocket socket =newServerSocket(port);while(true){Socket client = socket.accept();newClientReadingThread(client);
writer =newPrintWriter(client.getOutputStream());}}catch(IOException e){
e.printStackTrace();}}publicvoidsendMessage(String msg){if(writer!=null){
writer.println(msg);
writer.flush();}}privateclassClientReadingThreadimplementsRunnable{privateBufferedReader reader;publicClientReadingThread(Socket client){try{
reader =newBufferedReader(newInputStreamReader(client.getInputStream()));newThread(this).start();}catch(IOException e){
e.printStackTrace();}}publicvoidrun(){try{String msg;while((msg=reader.readLine())!=null){System.out.println("$$$ server received message from client $$$");System.out.println(msg);System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");sendMessage("You wrote me: "+ msg);}}catch(IOException e){
e.printStackTrace();}}}}classClient{privatePrintWriter writer;publicClient(){try{Socket socket =newSocket("localhost", port);newReceivingThread(socket);
writer =newPrintWriter(socket.getOutputStream());}catch(UnknownHostException e){
e.printStackTrace();}catch(IOException e){
e.printStackTrace();}}publicvoidsendMessage(String msg){if(writer!=null){
writer.println(msg);
writer.flush();}}classReceivingThreadimplementsRunnable{privateBufferedReader reader;publicReceivingThread(Socket client){try{
reader =newBufferedReader(newInputStreamReader(client.getInputStream()));newThread(this).start();newThread(newRunnable(){publicvoidrun(){Scanner scanner =newScanner(System.in);String msg;while(!(msg = scanner.nextLine()).equalsIgnoreCase("end")){sendMessage(msg);}System.out.println("client cannot send anymore.");}}).start();}catch(IOException e){
e.printStackTrace();}}publicvoidrun(){try{String msg;while((msg=reader.readLine())!=null){System.out.println("*** client received message from server ***");System.out.println(msg);System.out.println("*******************************************");}}catch(IOException e){
e.printStackTrace();}}}}}
Schön.
Ich glaube dir zwar das an dem Code einiges falsch sein kann aber:
1. Ja aber man lernt immer dazu
2. Es wird kein Chat
3. Danke für die Lösung
4. Darum geht es überhaupt nicht
5. Wie bekomme ich die Variablen tf & b1 in die Klasse ServerThread?
Ich habe das ganze mal ein wenig erweitert.
Das ganze muss natürlich jetzt noch in schön gebaut werden, aber vom Prinziep her sollte es das sein, oder ?
Java:
package kleinerserver;importjava.net.*;importjava.util.ArrayList;importjava.awt.*;importjava.awt.event.*;importjava.io.*;publicclassKleinerServer{/**
* Am besten noch ein wenig mit OOP beschaeftigen.
* Die ganzen Variablen muessten nicht static sein
*/staticServerSocket server;staticButton b1;staticString str;staticPrintWriter p;// Ich habe dies zu einer Liste geandert damit sich mehrere Client verbinden koennenstatic java.util.List<ServerThread> st;staticTextField tf;KleinerServer(){}publicstaticvoid main (String[] args){Frame f =newFrame();
f.setLayout(newFlowLayout());
b1 =newButton("GetText");
tf =newTextField();
tf.setPreferredSize(newDimension(80,30));
f.add(b1);
f.add(tf);
st =newArrayList<ServerThread>();// Hier werden die ClientAnfragen angenommen, muss natürlich in eine eigene Klasse ;)try{
server =newServerSocket(1234);// Thread zum lauschen auf VerbindungenThread thread =newThread(newRunnable(){@Overridepublicvoidrun(){Socket newClient;ServerThread newServerThread;// ACHTUNG momentan noch Endlosschleife, sollte man aendern ;)while(true){try{
newClient = server.accept();
newServerThread =newServerThread(newClient);
newServerThread.start();
st.add(newServerThread);}catch(IOException e){// TODO Auto-generated catch block
e.printStackTrace();}}// Wenn keine Endlosschleife mehr kann und sollte dies hier aufgerufen werden ;)//server.close();}});
thread.start();}catch(IOException e1){
e1.printStackTrace();}ActionListener al =newActionListener(){publicvoidactionPerformed(ActionEvent ae ){// Sende Nachricht an alle angemeldeteten Clientsfor(ServerThread connection : st){if(connection.sendMessage(tf.getText())){System.out.println("Message send ok");}else{System.out.println("Message send failure");}}}};
b1.addActionListener( al );
f.pack();
f.setVisible(true);}}
Server:
Java:
package kleinerserver;importjava.io.*;importjava.net.*;importjava.util.Queue;publicclassServerThreadextendsThread{privateSocket s;boolean run;publicServerThread(Socket client){this.s = client;
run =false;}publicsynchronizedbooleansendMessage(String message){try{BufferedWriter out =newBufferedWriter(newOutputStreamWriter(s.getOutputStream()));
out.write(message);
out.newLine();
out.flush();returntrue;}catch(IOException e){// TODO um Exception kuemmern, werfen ?System.out.println("Fehler");returnfalse;}}publicsynchronizedvoidshutdown(){
run =false;}publicvoidrun(){try{BufferedReader in =newBufferedReader(newInputStreamReader(s.getInputStream()));
run =true;while(!interrupted()&& run){/**
* Hier wuerde gelesen werden
* in etwa:
*
* char[] buffer = new char[1024];
* int bytesRead = in.read(buffer);
* System.out.println(new String(buffer, 0, bytesRead));
*
*/}}catch(IOException e1){
run =false;/**
* TODO Um Exception kuemmern
*/
e1.printStackTrace();}finally{try{
s.close();}catch(IOException e){//TODO um Exception kuemmern
e.printStackTrace();}}}}