构建在线白板的正确方法

时间:2012-04-01 05:00:12

标签: java swing

我正在构建一个白板,它将有一个服务器(教师)和客户(学生)。老师会在他身边画一些东西,这些东西将与学生完全相同。

  1. 我想知道我应该用哪个组件来绘图?我目前正在使用JPanel。
  2. 我希望Server的屏幕被复制到客户端上,那么为什么这可能是正确的方法呢?
    • option1:我将JPanel保存为图像,并通过套接字发送,并将其加载到客户端的屏幕上,也始终只保存背景图像,而不是用户绘制到它上面的图像。 OR
    • option2:服务器和客户端的JPanel尺寸都相同,所以我只是发送每次通过套接字绘制的新坐标,用一些协议来了解它是橡皮还是铅笔..
  3. 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:6)

  1. 除非您需要添加其他组件,否则请使用JComponent,然后使用JPanel
  2. 发送绘图对象而不是图像。它比推动图像的带宽更少。还要实现协议以允许“添加或删除”绘制的元素。这样你只需要将最新的对象发送给每个客户端。这种方法还具有为最终用户(学生)提供更多使用的额外好处。您可以稍后添加功能以允许学生调整/添加/删除图形中的元素。
  3. 更新

      

    如果我在老师的一边画一条线,同样应该发生在孩子的屏幕上,直播,所以有一种实时绘画的感觉..

    然后你肯定想要尽可能减少带宽密集的路线。那将是瓶颈。

      

    ..有一个JFrame,我有2个JPanels,1个用于绘图,1个用于按钮。

    在这种情况下,将绘图组件设为JComponent&保留JPanel(或JToolBar)作为控件。

      

    ..什么是“可能的最小带宽密集路线”?

    按照带宽和忽略极端情况的顺序,它们会按照以下顺序减少

    1. 发送全屏图片:
      1. 高品质JPEG
      2. PNG。
      3. 高压缩JPEG
    2. 发送部分屏幕图像:
      1. 高品质JPEG
      2. PNG。
      3. 高压缩JPEG
    3. 直接处理绘图元素,发送:
      1. 每个更新的完整绘制对象列表
      2. 当前对绘制元素的修改,添加,删除,依赖客户端持有模型并根据需要进行调整。
    4. 如果有任何混淆,我建议选项3.2。

答案 1 :(得分:4)

使用Robot.createScreenCapture()并广播整个教师的屏幕。

捕获:

sendBuffer[index++] = robot.createScreenCapture(new Rectangle(0,0,1360,768));

显示:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(receiveBuffer[index], 0, 0, jFrame.getWidth(), jFrame.getHeight(), null);
    receiveBuffer[index++]=null;
}

你必须在接收器中进行重新缩放。