Kultom Skrevet 7. november 2007 Del Skrevet 7. november 2007 (endret) Hei, vi har et "lag en IRC klient" oppgave på Skolen nå om dagen. Alt virket helt ok og greit, helt til idag. Da jeg tenkte jeg skulle få meldingene irc-serveren sendte ut til å skrives til et JTextArea istede for bare kommandolinje(System.out.println). Har slitt i timesvis med detta nå, og det er sikkert det som er problemet. Jeg har tenkt for mye på det og ser ikke at løsningen er alt for enkel. Anyways, noen som har noen gode forslag til hvordan jeg skal løse det problemet. koden er som følgenede: IrcSimple-Fil: public class IrcSimple{ public JFrame frame; public JTextArea ta; public JTextField tf; public IrcSimple ( IRCConnection ircCon ) { frame = new JFrame("IrcSimple"); ta = new JTextArea(); tf = new JTextField(); frame.getContentPane().add(ta, BorderLayout.CENTER); frame.getContentPane().add(tf, BorderLayout.SOUTH); frame.setSize(300, 600); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ircCon.addMessageListener(new ToTextAreaListener() ); } } IRCConnection-fil (gitt av læreren): public class IRCConnection implements Runnable { public static final int CONNECTED = 0; public static final int CONNECTING = 1; public static final int DISCONNECTED = 2; public static final int DISCONNECTING = 3; private int state = DISCONNECTED; private String server; private int port; private String nick; private String altNick; private String username; private String fullname; private Socket socket; private String localHost; private Thread messageThread; private BufferedReader input; private DataOutputStream output; private java.util.Vector listeners = new Vector (); private static Logger logging = Logger.getLogger (IRCConnection.class.getName()); public IRCConnection(String server, int port, String nick, String altNick, String username, String fullname) { this.server = server; this.port = port; this.nick = nick; this.altNick = altNick; this.username = username; this.fullname = fullname; } public void addMessageListener (MessageListener ml) { logging.fine ("Added messageListener : "+ml.getClass().getName()); listeners.add (ml); } public void removeMessageListener (MessageListener ml) { logging.fine ("Removed messageListener : "+ml.getClass().getName()); listeners.remove (ml); } public void connect () { messageThread = new Thread (this); messageThread.start (); logging.fine ("Started new IRCConnection thread, attempting connection"); } public int getState () { return state; } public void writeln(String message) { try { output.writeBytes(message+"\r\n"); } catch (Exception e) { } logging.fine ("Sent message to server : "+message); } public void writetext(String text, JTextArea ta) { try { ta.setText(ta.getText()+text+"\n"); } catch (Exception e) { } } private void message (String message) { String prefix="", command=""; if (message.startsWith (":")) { prefix = message.substring (1, message.indexOf(" ")); message = message.substring (message.indexOf(" ")+1); } command = message.substring (0, message.indexOf(" ")); message = message.substring (message.indexOf(" ")+1); logging.finest ("New message arriver : "+command+"|"+message); MessageEvent me = new MessageEvent (prefix, command, message, this); for (Enumeration e = listeners.elements(); e.hasMoreElements(); ) { MessageListener listener = ((MessageListener)e.nextElement()); listener.messageReceived(me); if (me.isConsumed()) { logging.finest ("Message handled by "+listener.getClass().getName()); break; } } } public void run() { addMessageListener (new LoggedOnDetector ()); state = CONNECTING; try { socket = new Socket(server,port); localHost = socket.getLocalAddress().getHostName(); } catch (Exception e) { // UnknownHostException or IOException close(); return; } try { logging.fine ("Opening connection to server"); input = new BufferedReader(new InputStreamReader(new DataInputStream(socket.getInputStream()))); output = new DataOutputStream(socket.getOutputStream()); logging.fine ("Sending nick to server"); writeln( "NICK "+nick+"\r\n"); logging.fine ("Sending username to server"); writeln( "USER "+username+" "+localHost+" "+server+" :"+fullname+"\r\n"); } catch (Exception e) { // IOException close(); return; } try { String message; while ((message = input.readLine()) != null) { message (message); } } catch (Exception e) { if (state != DISCONNECTING) { e.printStackTrace(); } } close(); } private void close() { logging.fine ("Closing connection to server"); if (state == CONNECTED) { state = DISCONNECTING; try { output.writeBytes("QUIT"); } catch (Exception e) {} try { socket.close(); } catch (Exception e) {} socket = null; try { messageThread.join(); } catch (InterruptedException e) { } state = DISCONNECTED; } } public static void main (String args[]) { IRCConnection forbindelse = new IRCConnection ("irc.homelien.no", 6667, "d458", "Argher439875", "***@*****.**", "**** ***"); forbindelse.addMessageListener (new GlobalMessageListener ()); forbindelse.connect(); forbindelse.addMessageListener (new PingListener ()); while (forbindelse.state!=IRCConnection.CONNECTED) { try { Thread.currentThread().sleep (100); } catch (Exception e) { } } forbindelse.writeln ("JOIN #norge"); } private class LoggedOnDetector implements MessageListener { public void messageReceived (MessageEvent me) { logging.fine ("Message arrived from server, we have a connection"); if (me.getCommand().equals ("375")||me.getCommand().equals("001")) { state = CONNECTED; removeMessageListener (this); } } } } MessageEvent-Fil (Gitt av læreren): public class MessageEvent { private String prefix, command, message; private boolean consumed = false; private Object source; public MessageEvent (String prefix, String command, String message, Object source) { this.prefix = prefix; this.command = command; this.message = message; this.source = source; } public void consume () { consumed = true; } public boolean isConsumed () { return consumed; } public String getPrefix () { return prefix; } public String getCommand () { return command; } public String getMessage () { return message; } public Object getSource () { return source; } public String toString () { return prefix+"*"+command+"*"+message; } } MessageListener (gitt av læreren) public interface MessageListener { public void messageReceived (MessageEvent me); } GlobalMessage Listener denne skriver ut meldingene fra serveren til kommandolinja, det er greit nok, funker fint å koble til på IRC og joine kanaler og chatte osv, men det blir veeeeldig tungvint. Så vi skal gjør det grafisk og forenkle osv. : public class GlobalMessageListener implements MessageListener { public void messageReceived (MessageEvent me) { System.out.println (me.getPrefix()+"\t"+me.getCommand()+"\t"+me.getMessage()); } } Jeg tenkte jeg skulle lage noe lignende GlobalMessageListener, bare at den kanskje returnerte en String som jeg kunne legge til på TextArea. Men det ser ikke ut til å funke, noen som har tiden og viljen til å se litt på denne og komme med et par tips? Java kurset virket helt greit og ikke særlig krevende før dette. Kanskje bare jeg som har vært borte 1 time og gått glipp av noe :S Uansett, alle råd er gode råd. <3 Endret 7. november 2007 av kvitrafn Lenke til kommentar
pgdx Skrevet 7. november 2007 Del Skrevet 7. november 2007 I IrcSimple-klassen, lag metoden addMessage, elns: public void addMessage(String s) { message.setText(message.getText() + "\n" + s); } Og kall den metoden med strengen du vil legge til i vinduet. Jeg ville kanskje brukt en JLabel istedenfor en JTextArea dersom du bare vil vise. Da kan du utvide med HTML senere. Altså, noe ala dette: public class GlobalMessageListener implements MessageListener { public void messageReceived (MessageEvent me) { ircSimple.addMessage(me.getPrefix()+"\t"+me.getCommand()+"\t"+me.getMessage()); } } Lenke til kommentar
Kultom Skrevet 7. november 2007 Forfatter Del Skrevet 7. november 2007 (endret) Takker, skal prøve det senere, om det er så lett så er jeg en blid blid gutt. Elsker det, det funka med litt modifikasjoner ( ville ha noe static, men var ikke værre enn å gjøre metoden og JLabelen statisk heller ) Takker <3 Endret 7. november 2007 av kvitrafn Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå