Japplet networking

Συζητήσεις για την Java

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 15 Ιούλ 2009 09:23

Παιδια καποιος που εχει δουλεψει με Japplet και νηματα?
θελω να τρεχω ενα νημα στο backround για να παιρνω μυνηματα απο τον server και δεν τα καταφερνω. Βασικα δεν καταφερα να τρεξω νημα σε japplet χωρις να συγχιζεται το Gui μου.¨
Προσπαθησα και με με το swingworker αλλα δεν τα καταφερα.

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Japplet networking

Δημοσίευση από virxen75 » 15 Ιούλ 2009 10:17

στείλε τον κώδικα του applet που δοκίμασες και έχεις
πρόβλημα

iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 15 Ιούλ 2009 23:13

νασαι καλα ρε φιλε. θελω στον client με το event keytyped o client να στελνει τα μυνηματα στον server(βασικα στελνει σαν string στον server το περιεχομενο του jtextarea). παραλληλα στον client θελω να τρεχει ενα νημα το οποιο να
παιρνει τα εισερχομενα μυνηματα απο τον server ο οποιος στελνει σε ολα τα sockets που ειναι ενωμενα και μολις παρει το μυνημα να το γραφει στο jtextrea(οταν δεις τον κωδικα θα καταλαβεις - ειναι πολυ απλος). βασικα οταν δημιουργω νεο νημα το jtextarea μου δεν δουλευει. δεν με αφηνει να γραψω. Καπως συγχυζεται το νημα που δημιουργει το japplet by default με το νημα που δημιουργω εγω. τρεξε τον server και δημιουργησε 2 clients. θα δεις οτι το sto jtextarea δεν σε αφηνει να γραψεις γιατι κατι προβλημα κανει το νημα που δημιουργω.

ξαναγραφω το σεναριο. θελω ο client με to keytyped event να στελνει στον server ολο το κειμενο του jtextarea σαν μηνημα στον server και στο backround να τρεχει ενα νημα (ατερμων loop) και να παιρνει τα μηνηματα απο τον server και μολις παρει ενα μηνημα να το γραφει σαν κειμενο στο jtextarea.

αυτος ειναι ο server ο οποιος δουλευει μια χαρα.μην δωσεις σημασια στον server παρα μονο στον client. εκει ειναι το προβλημα. απλως σου εστειλα και τις 2 κλασεις του server
μηπως και χρειαστει να τις τρεξεις. στον server δινω σαν argument to port 9002.

Κώδικας: Επιλογή όλων

import java.io.*;
import java.net.*;
import java.util.*;

public class Server {

 private Hashtable outputStreams = new Hashtable();
 private ServerSocket ss;

 public Server( int port ) throws IOException {
    ss = new ServerSocket( port );

    System.out.println( "Listening on "+ss );

    while (true) {
    Socket s = ss.accept();
    System.out.println( "Connection from "+s );
    DataOutputStream dout = new DataOutputStream( s.getOutputStream() );
    outputStreams.put( s, dout );
    new ServerThread( this, s );
}
}

 Enumeration getOutputStreams() {
return outputStreams.elements();
}

void sendToAll( String message ) {
synchronized( outputStreams ) {
for (Enumeration e = getOutputStreams(); e.hasMoreElements(); ) {
DataOutputStream dout = (DataOutputStream)e.nextElement();

try {
dout.writeUTF( message );
} catch( IOException ie ) { System.out.println( ie ); }
}
}
}

void removeConnection( Socket s ) {
synchronized( outputStreams ) {
System.out.println( "Removing connection to "+s );
outputStreams.remove( s );
try {
s.close();
} catch( IOException ie ) {
System.out.println( "Error closing "+s );
ie.printStackTrace();
}
}
}


    static public void main( String args[] ) throws Exception {

int port = Integer.parseInt( args[0] );
new Server( port );
}
}

Κώδικας: Επιλογή όλων


import java.io.*;
import java.net.*;
public class ServerThread extends Thread
{

private Server server;
private Socket socket;

public ServerThread( Server server, Socket socket ) {

this.server = server;
this.socket = socket;
start();
}

public void run() {
try {
DataInputStream din = new DataInputStream( socket.getInputStream() );

while (true) {
String message = din.readUTF();
server.sendToAll( message );
}
} catch( EOFException ie ) {

} catch( IOException ie ) {

ie.printStackTrace();
} finally {

server.removeConnection( socket );
}
}
}

Αυτος ειναι ο client ο οποιος ειναι japplet και στελνει τα μηνηματα στον server τα οποια ο server προοθει στους αλλους client.μην δωσεις σημασια στην Initcomponents παρα μονο εκει που στελνω και παραλαμβανω τα μηνηματα απο server.

Κώδικας: Επιλογή όλων

import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;



public class ClientApplet extends javax.swing.JApplet implements Runnable{

    String host="localhost";
    int port=9002;
    private Socket socket;
    private DataOutputStream dout;
    private DataInputStream din;
    

    Runnable r = new Runnable() {
    public void run() {
        try {

        while (true) {
String message = din.readUTF();
jTextArea1.setText(message);

}
} catch( IOException ie ) { System.out.println( ie ); }
    }
};


    /** Initializes the applet ClientApplet */
    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        try {

socket = new Socket( host, port );

System.out.println( "connected to "+socket );

din = new DataInputStream( socket.getInputStream() );
dout = new DataOutputStream( socket.getOutputStream() );

} catch( IOException ie ) { System.out.println( ie ); }
        
   new Thread(r).start();


    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents&#40;&#41; &#123;

        jScrollPane1 = new javax.swing.JScrollPane&#40;&#41;;
        jTextArea1 = new javax.swing.JTextArea&#40;&#41;;

        jTextArea1.setColumns&#40;20&#41;;
        jTextArea1.setRows&#40;5&#41;;
        jTextArea1.addKeyListener&#40;new java.awt.event.KeyAdapter&#40;&#41; &#123;
            public void keyTyped&#40;java.awt.event.KeyEvent evt&#41; &#123;
                jTextArea1KeyTyped&#40;evt&#41;;
            &#125;
        &#125;&#41;;
        jScrollPane1.setViewportView&#40;jTextArea1&#41;;

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout&#40;getContentPane&#40;&#41;&#41;;
        getContentPane&#40;&#41;.setLayout&#40;layout&#41;;
        layout.setHorizontalGroup&#40;
            layout.createParallelGroup&#40;javax.swing.GroupLayout.Alignment.LEADING&#41;
            .addGroup&#40;layout.createSequentialGroup&#40;&#41;
                .addGap&#40;67, 67, 67&#41;
                .addComponent&#40;jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 259, javax.swing.GroupLayout.PREFERRED_SIZE&#41;
                .addContainerGap&#40;74, Short.MAX_VALUE&#41;&#41;
        &#41;;
        layout.setVerticalGroup&#40;
            layout.createParallelGroup&#40;javax.swing.GroupLayout.Alignment.LEADING&#41;
            .addGroup&#40;layout.createSequentialGroup&#40;&#41;
                .addGap&#40;26, 26, 26&#41;
                .addComponent&#40;jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 246, javax.swing.GroupLayout.PREFERRED_SIZE&#41;
                .addContainerGap&#40;40, Short.MAX_VALUE&#41;&#41;
        &#41;;
    &#125;// </editor-fold> 
      

                 
public void run&#40;&#41; &#123;
        try &#123;

        while &#40;true&#41; &#123;

String message = din.readUTF&#40;&#41;;
jTextArea1.setText&#40;message&#41;;

&#125;
&#125; catch&#40; IOException ie &#41; &#123; System.out.println&#40; ie &#41;; &#125;
    &#125;

    private void jTextArea1KeyTyped&#40;java.awt.event.KeyEvent evt&#41; &#123;                                    
        String text=jTextArea1.getText&#40;&#41;;
        try &#123;
            dout.writeUTF&#40;text&#41;;
        &#125; catch &#40;IOException ex&#41; &#123;
            Logger.getLogger&#40;ClientApplet.class.getName&#40;&#41;&#41;.log&#40;Level.SEVERE, null, ex&#41;;
        &#125;
    &#125;                                   


    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration                   

&#125;

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Japplet networking

Δημοσίευση από virxen75 » 17 Ιούλ 2009 04:19

Κώδικας: Επιλογή όλων

import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;



public class ClientApplet extends javax.swing.JApplet implements Runnable&#123;
private String currentText="";

    String host="localhost";
    int port=9002;
    private Socket socket;
    private DataOutputStream dout;
    private DataInputStream din;
   private Thread t;
private boolean insert=false;
private String text;



    /** Initializes the applet ClientApplet */
    @Override
    public void init&#40;&#41; &#123;
        System.out.println&#40;"init&#40;&#41;&#58; creating thread"&#41;;
      t = new Thread&#40; this &#41;;
      System.out.println&#40;"init&#40;&#41;&#58; starting thread"&#41;;
      
      System.out.println&#40;"init&#40;&#41;&#58; end"&#41;;
initComponents&#40;&#41;;
       
       
        try &#123;

socket = new Socket&#40; host, port &#41;;

System.out.println&#40; "connected to "+socket &#41;;

din = new DataInputStream&#40; socket.getInputStream&#40;&#41; &#41;;
dout = new DataOutputStream&#40; socket.getOutputStream&#40;&#41; &#41;;

&#125; catch&#40; IOException ie &#41; &#123; System.out.println&#40; ie &#41;; &#125;
       t.start&#40;&#41;;
   //new Thread&#40;r&#41;.start&#40;&#41;;


    &#125;
   
    @SuppressWarnings&#40;"unchecked"&#41;
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents&#40;&#41; &#123;

        jScrollPane1 = new javax.swing.JScrollPane&#40;&#41;;
        jTextArea1 = new javax.swing.JTextArea&#40;&#41;;

        jTextArea1.setColumns&#40;20&#41;;
        jTextArea1.setRows&#40;5&#41;;
    jTextArea1.getDocument&#40;&#41;.addDocumentListener&#40;new MyDocumentListener&#40;&#41;&#41;;
    //jTextArea1.getDocument&#40;&#41;.putProperty&#40;"name", "Text Area"&#41;;
        jScrollPane1.setViewportView&#40;jTextArea1&#41;;

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout&#40;getContentPane&#40;&#41;&#41;;
        getContentPane&#40;&#41;.setLayout&#40;layout&#41;;
        layout.setHorizontalGroup&#40;
            layout.createParallelGroup&#40;javax.swing.GroupLayout.Alignment.LEADING&#41;
            .addGroup&#40;layout.createSequentialGroup&#40;&#41;
                .addGap&#40;67, 67, 67&#41;
                .addComponent&#40;jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 259, javax.swing.GroupLayout.PREFERRED_SIZE&#41;
                .addContainerGap&#40;74, Short.MAX_VALUE&#41;&#41;
        &#41;;
        layout.setVerticalGroup&#40;
            layout.createParallelGroup&#40;javax.swing.GroupLayout.Alignment.LEADING&#41;
            .addGroup&#40;layout.createSequentialGroup&#40;&#41;
                .addGap&#40;26, 26, 26&#41;
                .addComponent&#40;jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 246, javax.swing.GroupLayout.PREFERRED_SIZE&#41;
                .addContainerGap&#40;40, Short.MAX_VALUE&#41;&#41;
        &#41;;
    &#125;// </editor-fold>
     

                 
public void run&#40;&#41; &#123;
        try &#123;

        while &#40;true&#41; &#123;
System.out.println&#40;"runnining..."&#41;;

String message = din.readUTF&#40;&#41;;
System.out.println&#40;"din="+message&#41;;

if &#40;!currentText.equals&#40;message&#41;&#41;&#123;
            currentText=message;
             jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;;
    jTextArea1.setText&#40;message&#41;;
 jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;;

&#125;
&#125;
&#125; catch&#40; IOException ie &#41; &#123; 
    System.out.println&#40; ie &#41;; 
&#125;
    &#125;

                               


    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration     


class MyDocumentListener implements DocumentListener &#123;
    String newline = "\n";
 
    public  void  insertUpdate&#40;DocumentEvent e&#41; &#123;
       insert=true;
        System.out.println&#40;"\n======================="&#41;;
        System.out.println&#40;"\nout&#40;insert_update&#41;="&#41;;
text=jTextArea1.getText&#40;&#41;;
        if &#40;!currentText.equals&#40;text&#41;&#41;&#123;
            currentText=text;
             jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;;

        System.out.println&#40;"out&#40;insert_update&#41;="+text&#41;;
        try &#123;
            dout.writeUTF&#40;text&#41;;
        &#125; catch &#40;IOException ex&#41; &#123;
            Logger.getLogger&#40;ClientApplet.class.getName&#40;&#41;&#41;.log&#40;Level.SEVERE, null, ex&#41;;
        &#125;
        &#125;
    &#125;
    public void removeUpdate&#40;DocumentEvent e&#41; &#123;

    &#125;
    public void changedUpdate&#40;DocumentEvent e&#41; &#123;

    &#125;



        
    &#125;


&#125; 
είναι μία αρχή θέλει δουλειά ακόμα

iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 17 Ιούλ 2009 09:11

ρε φιλε εισαι παλληκαρι. εισαι λεβεντης. τι να σου πω. τρεχει μια χαρα.

αλλα να ρωτησω κατι γιατι ειμαι νεος σε java.

1) καταρχας γιατι ηταν καλυτερα να χρησιμοποιησουμε την DocumentListener αντι του keytyped event που προσπαθουσα να χρησιμοποιησω εγω.

2) το νημα που εβαλες δεν αντιμετωπιζει κανενα προβλημα. ενω αυτα που εβαζα εγώ καπως δεν δουλευαν και δεν ξερω γιατι. δεν ξερω αν ηταν και αλλου το λαθος. Επισης δεν χρησιμοποιησες το event-dispatching thread που καλει την invokeAndWait() για να αρχικοποιησει το GUI το οποιο βαζει by default to netbeans. Δεν το ηξερα οτι δεν ειναι υποχρεωτικο.Η κανω λαθος?

Ειμαι λιγο νεος σε java. Συγχωρεσε με αν οι ερωτησεις ειναι βλακωδεις.


Επισης μια απορια που πρεπει να υλοποιησω παρακατω. για να κανω νεο chat room πρεπει να δημιουργω καθε φορα νεο instance του server σε διαφορετικο port? Η καπως πρεπει να γραψω κωδικα που να καταλαμβαινει ο server σε ποιο chat room να προωθεί τα μυνηματα που ερχονται?γιατι την ιδια στιγμη θα παιρνουν μερος πολλεσ συζητησεις. ποιο ειναι το σωστο?

Παντως ευχαριστω πολυ για τον χρονο που αφιερωσες φιλε. η βοηθεια σου ηταν πολυτιμη.

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Japplet networking

Δημοσίευση από virxen75 » 17 Ιούλ 2009 13:38

με τον listener που έχεις βάλει εσύ υλοποιείται καλύτερα αρκεί
αντί keyTyped--->keyReleased

Κώδικας: Επιλογή όλων


import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;



public class ClientApplet extends javax.swing.JApplet implements Runnable&#123;
private String currentText="";

    String host="localhost";
    int port=9002;
    private Socket socket;
    private DataOutputStream dout;
    private DataInputStream din;
   private Thread t;
private boolean insert=false;
private String text;



    /** Initializes the applet ClientApplet */
    @Override
    public void init&#40;&#41; &#123;
        System.out.println&#40;"init&#40;&#41;&#58; creating thread"&#41;;
      t = new Thread&#40; this &#41;;
      System.out.println&#40;"init&#40;&#41;&#58; starting thread"&#41;;
      
      System.out.println&#40;"init&#40;&#41;&#58; end"&#41;;
initComponents&#40;&#41;;
       
       
        try &#123;

socket = new Socket&#40; host, port &#41;;

System.out.println&#40; "connected to "+socket &#41;;

din = new DataInputStream&#40; socket.getInputStream&#40;&#41; &#41;;
dout = new DataOutputStream&#40; socket.getOutputStream&#40;&#41; &#41;;

&#125; catch&#40; IOException ie &#41; &#123;
    System.out.println&#40; ie &#41;; 
&#125;
       t.start&#40;&#41;;


    &#125;
   
    @SuppressWarnings&#40;"unchecked"&#41;
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents&#40;&#41; &#123;

        jScrollPane1 = new javax.swing.JScrollPane&#40;&#41;;
        jTextArea1 = new javax.swing.JTextArea&#40;&#41;;

        jTextArea1.setColumns&#40;20&#41;;
        jTextArea1.setRows&#40;5&#41;;
        jTextArea1.addKeyListener&#40;new java.awt.event.KeyAdapter&#40;&#41; &#123;
            @Override
            public void keyReleased&#40;java.awt.event.KeyEvent evt&#41; &#123;
                jTextArea1KeyTyped&#40;evt&#41;;
            &#125;
        &#125;&#41;;
        jScrollPane1.setViewportView&#40;jTextArea1&#41;;

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout&#40;getContentPane&#40;&#41;&#41;;
        getContentPane&#40;&#41;.setLayout&#40;layout&#41;;
        layout.setHorizontalGroup&#40;
            layout.createParallelGroup&#40;javax.swing.GroupLayout.Alignment.LEADING&#41;
            .addGroup&#40;layout.createSequentialGroup&#40;&#41;
                .addGap&#40;67, 67, 67&#41;
                .addComponent&#40;jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 259, javax.swing.GroupLayout.PREFERRED_SIZE&#41;
                .addContainerGap&#40;74, Short.MAX_VALUE&#41;&#41;
        &#41;;
        layout.setVerticalGroup&#40;
            layout.createParallelGroup&#40;javax.swing.GroupLayout.Alignment.LEADING&#41;
            .addGroup&#40;layout.createSequentialGroup&#40;&#41;
                .addGap&#40;26, 26, 26&#41;
                .addComponent&#40;jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 246, javax.swing.GroupLayout.PREFERRED_SIZE&#41;
                .addContainerGap&#40;40, Short.MAX_VALUE&#41;&#41;
        &#41;;
    &#125;// </editor-fold>
     

                 
public void run&#40;&#41; &#123;
        try &#123;

        while &#40;true&#41; &#123;
System.out.println&#40;"runnining..."&#41;;

String message = din.readUTF&#40;&#41;;
System.out.println&#40;"din="+message&#41;;

if &#40;!currentText.equals&#40;message&#41;&#41;&#123;
            currentText=message;
             jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;;
    jTextArea1.setText&#40;message&#41;;
 jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;;

&#125;
&#125;
&#125; catch&#40; IOException ie &#41; &#123; 
    System.out.println&#40; ie &#41;; 
&#125;
    &#125;

                               
private void jTextArea1KeyTyped&#40;java.awt.event.KeyEvent evt&#41; &#123; 
    text=jTextArea1.getText&#40;&#41;;
        if &#40;!currentText.equals&#40;text&#41;&#41;&#123;
            currentText=text;
             jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;;

        System.out.println&#40;"out&#40;insert_update&#41;="+text&#41;;
        try &#123;
            dout.writeUTF&#40;text&#41;;
        &#125; catch &#40;IOException ex&#41; &#123;
            Logger.getLogger&#40;ClientApplet.class.getName&#40;&#41;&#41;.log&#40;Level.SEVERE, null, ex&#41;;
        &#125;
        &#125;
    &#125;  

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration     





&#125; 


Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Japplet networking

Δημοσίευση από virxen75 » 17 Ιούλ 2009 14:08

αν έχεις μόνο ένα Server πρέπει το μήνυμα να έχει κάποιο πρόθεμα από
μπροστά π.χ. όνομα του chat room

String message="room45:msg:hello";

όταν το λαμβάνεις βλέπεις την επικεφαλίδα
αν σε αφορά* το μήνυμα το εμφανίζεις
αλλιώς το αγνοείς


*ClientApplet-->πρέπει να έχει ένα όνομα,το όνομα του chat room που ανήκει

iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 17 Ιούλ 2009 17:15

Ευχαριστω ρε φιλε νασαι καλα.

iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 20 Ιούλ 2009 00:12

Γιατι το event keytyped δεν δουλευει κανονικα ενω το event keyreleased με τον ιδιο κωδικα δουλευει κανονικα? Δεν το εχω καταλαβει αυτο.

προτιμώ το keytyped event λογο του οτι θελω να παιρνω τον χαρακτηρα για να δοκιμασω να στελνω τον χαρακτηρα αντι ολο το κειμενο.

με το keytyped μπορω να παρω τον χαρακτηρα που τυπωθηεκε ενω με το keyreleased παιρνω το keycode για οποιοδηποτε key εχει πατηθει.(π.χ shift) που δεν το θελω αυτο.

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Japplet networking

Δημοσίευση από virxen75 » 20 Ιούλ 2009 01:20

keytyped--->ενεργοποιείται πριν να μπει o χαρακτήρας στο textbox σου

keyreleased->ενεργοποιείται μετά που θα μπει ο χαρακτήρας στο textbox

άρα με το keytyped σου λείπει πάντα κάποιος-κάποιοι χαρακτήρες.

αν θες να το χρησιμοποιήσεις (keytyped) οπωσδήποτε
κάνε την πιο κάτω αλλαγή και βάλε listener to keytyped

Κώδικας: Επιλογή όλων

private void jTextArea1KeyTyped&#40;java.awt.event.KeyEvent evt&#41; &#123; 
    text=jTextArea1.getText&#40;&#41;+evt.getKeyChar&#40;&#41;;
        if &#40;!currentText.equals&#40;text&#41;&#41;&#123;
            currentText=text;
             jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;;

        System.out.println&#40;"out&#40;insert_update&#41;="+text&#41;;
        try &#123;
            dout.writeUTF&#40;text&#41;;
        &#125; catch &#40;IOException ex&#41; &#123;
            Logger.getLogger&#40;ClientApplet.class.getName&#40;&#41;&#41;.log&#40;Level.SEVERE, null, ex&#41;;
        &#125;
       &#125;
    &#125;  

text=jTextArea1.getText()+evt.getKeyChar();
αυτή είναι ουσιαστικά η αλλαγή προσθέτω και τον χαρακτήρα που δεν έχει μπει ακόμα
στο textbox μας.

iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 20 Ιούλ 2009 03:37

Α μαλιστα. τωρα καταλαβα γιατι το keytyped αφηνει μερικους χαρακτηρες πισω.
Βασικα σκεφτηκα αντι να στελνω ολο το κειμενο ολοκληρο το text να στελνω τον χαρακτηρα και την θεση που μπηκε στους αλλους users ουτως ωστε να μην γινεται override αυτο που εχουν γραψει σε περιπτωση ταυτοχρονης αλλαγης (επειδη θα εισαγουν ταυτοχρονα μεσα στο κειμενο και σε οποια θεση θελουν). Δεν ξερω πως θα το κανω αλλα θα το δοκιμασω.

αυτο η αλλαγη που ειπες δουλευει μονο οταν ο χαρακτηρας προστεθει στο τελος του κειμενου.
αλλα ενταξει εγω θα προσπαθησω να στειλω τον χαρακτηρα μονο.

iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 20 Ιούλ 2009 04:54

Φαινεται οτι δεν υπαρχει μεθοδος στο keytyped event που να παιρνει τις συντεταγμενες του jtextarea που εγινε triger το keytyped event. Δεν ξερω αν εχω λαθος.Δεν βρηκα κατι.

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Japplet networking

Δημοσίευση από virxen75 » 20 Ιούλ 2009 11:32

τον κώδικα τον έχεις δει καλά?
έχεις καταλάβει όλες τις εντολές του?
δεν υπάρχει κάτι που σου προκαλεί εντύπωση να μην ξέρεις τι ακριβώς κάνει?

π.χ τι κάνει αυτή η εντολή?

Κώδικας: Επιλογή όλων

jTextArea1.setCaretPosition&#40;jTextArea1.getDocument&#40;&#41;.getLength&#40;&#41;&#41;; 

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Japplet networking

Δημοσίευση από virxen75 » 20 Ιούλ 2009 11:39

δες και αυτό το παράδειγμα

Κώδικας: Επιλογή όλων

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JFrame &#123;
    JTextArea jta = new JTextArea&#40;"πως θα βρω την θεση του\n κέρσορα\nμέσα στο κείμενο μου\n"&#41;;
 JTextField txtLine,txtColumn;
    public Test&#40;&#41; &#123;
    	txtLine=new JTextField&#40;4&#41;;
    	txtColumn=new JTextField&#40;4&#41;;
    	JLabel lbl1=new JLabel&#40;"line"&#41;;
    	JLabel lbl2=new JLabel&#40;"column"&#41;;
    	JPanel p1=new JPanel&#40;&#41;;
    	p1.add&#40;lbl1&#41;;
    	p1.add&#40;txtLine&#41;;
    	p1.add&#40;lbl2&#41;;
    	p1.add&#40;txtColumn&#41;;
    
	setDefaultCloseOperation&#40; JFrame.EXIT_ON_CLOSE &#41;;
	Container content = getContentPane&#40;&#41;;
	content.add&#40;new JScrollPane&#40;jta&#41;, BorderLayout.CENTER&#41;;
	content.add&#40;p1,BorderLayout.EAST&#41;;
	JButton jb = new JButton&#40;"ΠΑΤΑ ΝΑ ΔΕΙΣ ΠΟΥ ΒΡΙΣΚΕΣΑΙ"&#41;;
	content.add&#40;jb, BorderLayout.SOUTH&#41;;
	jb.addActionListener&#40;new ActionListener&#40;&#41; &#123;
	    public void actionPerformed&#40;ActionEvent ae&#41; &#123;
		int cpos = jta.getCaretPosition&#40;&#41;, lpos=-1, line=-1;
		try &#123;
		    for &#40;int x=0; x<jta.getLineCount&#40;&#41;; x++&#41; &#123;
			if &#40;jta.getLineStartOffset&#40;x&#41;<=cpos&#41; &#123;
			    line=x;
			    lpos = cpos-jta.getLineStartOffset&#40;x&#41;;
			&#125; else break;
		    &#125;
		    txtLine.setText&#40;""+line&#41;;
		     txtColumn.setText&#40;""+lpos&#41;;
		&#125; catch &#40;javax.swing.text.BadLocationException ble&#41; &#123;
		    ble.printStackTrace&#40;&#41;;
		&#125;
	    &#125;
	&#125;&#41;;
	setSize&#40;600,300&#41;;
	show&#40;&#41;;
    &#125;
    public static void main&#40; String args&#91;&#93; &#41; &#123; new Test&#40;&#41;; &#125;
&#125;


iliadis
Δημοσιεύσεις: 24
Εγγραφή: 06 Φεβ 2009 01:10

Japplet networking

Δημοσίευση από iliadis » 20 Ιούλ 2009 18:47

Ναι εχω καταλαβει τι κανει ο κωδικας και η συγκεκριμενη γραμμη κωδικα απολυτως καλα. μαλιστα την συγκεκριμενη γραμμη κωδικα την ειχα αφαιρεσει γιατι μου εβαζε τον κερσορα παντα στο τελος και δεν το ηθελα αυτο. γιατι μπορει καπιος user να κανει τροποποιησεις στην μεση του κειμενου.

οποτε σε αυτο το παραδειγμα μου λες οτι ο μονος τροπος να παρω τις συντεταγμενες ειναι να παιρνω με αυτο τον τροπο με την βοηθεια του κερσορα και να υπολογιζω το row και column.

μετα ομως πως θα βαζω χαρακτηρα στο κειμενο αναλογα με το raw kai column. δεν υπαρχει τετοια συναρτηση στο jtextarea εισαγωγη πρεπει να γινεται χωρις να επηρεαζεται ο κερσορας του αλλου user.
εχω δοκιμασει με την συναρτηση insert αλλα δεν δουλευει. οταν το κειμενο ειναι αδειο πεταει ιillegalargumentexception. αποτι καταλαβα δουλευει μονο σε περιοχες που εχει κειμενο.

Επισης διαβασα σε ενα forum οτι το jtextarea δεν δουλευει με row kai columns οποτε πως θα εισαγουμε συμφωνα με αυτα?

Απάντηση

Επιστροφή στο “Java”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης