java - 在 JPanel 上绘制并将其广播到多个客户端

标签 java swing sockets jpanel graphics2d

我有一个带共享白板应用程序的多用户聊天室,我在其中使用 Jpanel 在特定客户端中绘制,然后通过服务器向其他客户端广播(通过 Java 套接字编程)。 我的问题是我想让绘图功能实时工作,因为只要在一个客户端的 JPanel 上完成绘图,其他客户端就应该可以看到它。我在 JPanel 的 mouseReleased 事件上编写了该函数,但只有在该客户端的 JPanel 上触发 mouseReleased 事件后,其他客户端才能看到它。 任何人都可以建议我可以使 Action 更好(实时)的东西吗?

        @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);
   }

//在 mouseReleased 事件上从 gui 调用以下方法

  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;
        }
}

最佳答案

    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);

关于java - 在 JPanel 上绘制并将其广播到多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34246128/

相关文章:

java - Java : Why can't I declare the reference-variable in one statement and create the referenced object in another statement of the class?

java - 无法绘制这个该死的矩形! (java Swing )

java - 如何保存复合类

Java - 将按钮单击从一个类传递到主类

java - 画九格荡 Swing 不行吗?

c - 在单个进程中管理多个套接字(最多 50 个套接字)的最有效方法?

Java Socket 等待 UTF8

java - 如何在 Apache 后面的 Tomcat 中获取真实的 http 请求?

java - JOptionPane 图标在 Windows 10 中被裁剪

c - 使用 C TCP 套接字, 'send' 可以返回零吗?