2016-08-09 153 views
0

i haben die beiden folgenden FunktionenJava Leinwand Zeichnung Sockel

public void mousePressed(MouseEvent e) { 
    x=e.getX(); 
    y=e.getY(); 
    PrintStream ps; 
    try { 
     ps = new PrintStream(sc.getOutputStream()); 
     ps.println("!!##print"+" "+x+" "+" "+y+" "+x+" "+y); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
} 
public void mouseDragged(MouseEvent e) { 
    x1=e.getX(); 
    y1=e.getY(); 
    gr=canvas.getGraphics(); 
    gr.drawLine(x, y, x1, y1); 
    if(x!=x1||y!=y1) 
    { 
     try { 
     PrintStream ps=new PrintStream(sc.getOutputStream()); 
     ps.println("!!##print"+" "+x+" "+" "+y+" "+x1+" "+y1); 
    } catch (IOException e1) { 

     e1.printStackTrace(); 
    } 
    } 
    x=x1; 
    y=y1; 
} 

Das Problem ist, wenn ich print verwenden, um die Punkte geht es in „Server-Handler“ zu schicken, wo ich sie in den console.I drucken sehen, dass Wenn ich mich schnell mit meiner Maus bewege, kann es nicht alle Punkte bekommen und die Punkte werden Leerzeichen enthalten, wenn ich sie in anderen Benutzerbereichen drucke. Wie kann ich alle Punkte bekommen, an denen meine Maus läuft, ohne sie zu verlieren? Was ist bei diesen Funktionen nicht gut? (Sc ist die Buchse an den Server) Hier ist der Teil, wo die Farbe Befehl in Server gehandhabt wird (Socke ist eine Arraylist von Steckdosen und sc ist die aktuelle Fassung)

Iterator<Socket> it=sock.iterator(); 
        while(it.hasNext()) 
        { 
         Socket vv=it.next(); 
         if(vv!=sc) 
         { 
          ps=new PrintStream (vv.getOutputStream()); 
          ps.println(ms); 
         } 
        } 

Hier ist der Teil, wo die Nachricht analysiert wird, um zu sehen, welche Punkte übertragen wurden und sie zu zeichnen.Hier läuft alles schief, weil es nicht alle Nachrichten erhält, die vom Server übertragen wurden.Warum das passiert und wie kann ich es lösen ?

else if(mes.charAt(0)=='!'&&mes.charAt(1)=='!'&&mes.charAt(2)=='#'&&mes.charAt(3)=='#'&& 
         mes.charAt(4)=='p'&&mes.charAt(5)=='r'&&mes.charAt(6)=='i'&&mes.charAt(7)=='n'&& 
         mes.charAt(8)=='t' 
         ) 
       { 
        StringTokenizer tok=new StringTokenizer(mes); 
        String aii=tok.nextToken(); 
        ArrayList<Integer> numere=new ArrayList<Integer>(); 
        for(int i=0;i<4;i++) 
        { 
         numere.add(Integer.parseInt(tok.nextToken())); 
        } 
        Graphics gs=canvas.getGraphics(); 
        gs.drawLine(numere.get(0), numere.get(1), numere.get(2), numere.get(3)); 
       } 
+0

Also nehme ich an, dass "sc" eine Socket-Verbindung zu einem Server ist? –

+0

yes.sorry für das nicht zu sagen – User124235

+0

und die Sache ist, dass auf meiner Leinwand ist es eine durchgehende Linie, wenn ich die Maustaste gedrückt und ziehen, aber wenn ich die Punkte in der Konsole übertrage ich sehe, dass es Punkte gibt, die fehlen – User124235

Antwort

1

Ich denke, Ihr Problem mit Ihrer PrintStream Ressource sein könnte. Du öffnest jedes Mal ein neues Pixel, wenn ein neues Pixel gezeichnet wird, und es könnte so schnell sein, dass das vorherige keine Zeit zum Schließen hatte, also wirft es einfach IOException. Ich empfehle, dass in Ihrer main Funktion oder irgendwo, wo Ihre Server-Verbindung (sc) gemacht wird, Sie auch eine globale PrintStream deklarieren, so dass Sie nicht öffnen und schließen müssen. Beispiel:

Socket sc; 
PrintStream ps; 

public static void main(String a[]){ 
    sc = new Socket("example.com"); 
    PrintStream ps = new PrintStream(sc.getOutputStream()); 
} 

Sobald das einfach gemacht wird Zugriff auf die globalen PrintStream Daten an den Server zu senden. Hoffe das hilft!

+0

funktionieren nicht.auf meiner aktuellen Leinwand, wo ich zeichne, ist alles in Ordnung, aber wenn ich alle Punkte an andere Benutzer übertrage und auf ihrer Leinwand zeichne geht alles schief. Ich kann nicht verstehen, warum – User124235

+0

Debuggen Sie Ihr Programm und sehen, ob alle Punkte tatsächlich erfolgreich an den Server gesendet werden. Wenn dies der Fall ist, debuggen Sie das andere Benutzerprogramm und prüfen Sie, ob sie alle Punkte erhalten. –

+0

wie ich in den Kommentaren oben sage, wenn ich die Punkte betrachte, die empfangen werden, sehe ich, dass ein Punkt fehlt (ich meine, sie sind nicht kontinuierlich, sie springen über eine Anzahl von Pixeln so schnell wie ich die Maus bewege) und meine Frage ist, warum es springt und wenn es richtig ist zu springen, warum auf meiner Leinwand sehe ich diese Punkte auch? – User124235