2015-12-12 2 views
2

У меня есть многопользовательская чат-комната с общим приложением для досок, где я использовал Jpanel для рисования в конкретном клиенте, а затем передавал по серверу другим клиентам (через Java Socket Programming). Моя проблема в том, что я хотел сделать функцию рисования в режиме реального времени, как только, когда рисунок будет выполнен на JPanel одного клиента, он должен быть виден другим клиентам. Я написал функцию на mouseReleased событии JPanel, но она видна другим клиентам только после того, как событие mouseReleased будет запущено на JPanel этого клиента. Может ли кто-нибудь предложить что-то, с помощью которого я могу сделать действие лучше (в режиме реального времени)?Опираясь на JPanel и передавайте его нескольким клиенту

 @Override 
     public void mouseReleased(MouseEvent e) {   
      lineObject = new LineMessage(); 
      lineObject.setImageMessage(DrawPanel.linelist); 
      ChatApplication_Client.Action_Paint(lineObject); 

     } 

ChatApplication_Client.java

public void run(){ 
    System.out.println("Listening for messages from server . . . ");      
    try{ 
        while(!receivingdone){ 
         object = myInputStream.readObject(); 

         if(object instanceof LineMessage) 
         { 
          lineObject = (LineMessage) object; 
          WhiteBoardMessageReceive(lineObject); 
         } 
        } 

     } 

// Этот метод отвечает за малярные и вещания на конец клиента

private void WhiteBoardMessageReceive(LineMessage lineObject) 
    { 
       ArrayList<Line> linelist = (ArrayList) 
       lineObject.getImageMessage();       
       ChatClient_GUI.TA_ChatWindow.append(lineObject.Name+": " 
           +lineObject.Text + "\n" + "At [" 
            +DateUtils.now()+ "] " + "\n"); 
        drawPanel.drawit(linelist); 
    } 

// Этот метод вызывается из графического интерфейса on mouseReleased event

public static void Action_Paint(LineMessage lineObject) 
    { 

     try 
     { 
     myOutputStream.reset(); 
     myOutputStream.writeObject(lineObject); 
     myOutputStream.flush(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

LineMessage.java

class LineMessage implements Serializable 
    { 
    ArrayList<Line> message; 
    Line line = new Line(); 
    String Name =line.getName() ; 
    String Text ; 
    public void setImageMessage(Object message) { 
      this.message = (ArrayList) message; 
    } 

    public Object getImageMessage() { 
    return message; 
    } 
} 
class Line extends ChatMessage implements Serializable { 
int startx, starty, endx, endy; 
    public Line() { 
    } 
    public Line(int sx, int sy, int ex, int ey) 
    { 
    setStartX(sx); 
    setStartY(sy); 
    setEndX(ex); 
    setEndY(ey); 
    } 
     public void setStartX(int sx) { 

     startx = sx; 
     } 
     public void setStartY(int sy) { 
     starty = sy; 
     } 
     public void setEndX(int ex) { 
     endx = ex; 
     } 
     public void setEndY(int ey) { 
     endy = ey; 
     } 
     public int getStartX() { 
     return startx; 
     } 
     public int getStartY() { 
     return starty; 
     } 
     public int getEndX() { 
     return endx; 
     } 
     public int getEndY() { 
     return endy; 
     } 
} 
+1

Мы собираемся нужно больше кода, чем это. Особенно полезен класс 'ChatApplication_Client', также класс' LineMessage'. –

+0

MouseMotionListener.mouseDragged – ControlAltDel

+0

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

ответ

0
List<Point> pointList = new ArrayList<>(); 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(300, 500); 

    JPanel panel = new JPanel(){ 
     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.setColor(Color.WHITE); 
      g.fillRect(0, 0, getWidth(), getHeight()); 

      g.setColor(Color.BLACK); 
      Point l = null; 
      for(Point p : pointList){ 
       if(l != null && p != null) 
        g.drawLine(l.x, l.y, p.x, p.y); 
       l = p; 
      } 
     } 
    }; 
    frame.setContentPane(panel); 

    panel.addMouseMotionListener(new MouseMotionListener() { 
     boolean isDrawing = false; 
     @Override 
     public void mouseDragged(MouseEvent e) { 
      pointList.add(e.getPoint()); 
      isDrawing = true; 
      panel.repaint(); 
     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      if(isDrawing) 
       pointList.add(null); //null is a placeholder to mean line is finished 
      isDrawing = false; 
     } 
    }); 


    frame.setVisible(true); 
+0

Возможно, добавьте объяснение, чтобы пойти наряду с кодом. –

+0

У меня есть часть кода, написанная в классе DrawPanel, где еще вы предлагаете мне внести изменения? –

+0

Где класс DrawPanel? Вместо этого вы должны использовать MouseMotionListener, как показано выше. Каждый раз, когда мышь перемещается, он вызывает mouseDragged, если кнопка мыши недоступна, или mouseMoved, если кнопка мыши поднята. Попробуйте запустить код выше, посмотрите, сможете ли вы понять, как это работает. Если все еще есть проблемы, я здесь. –

 Смежные вопросы

  • Нет связанных вопросов^_^