views:

208

answers:

4

I have to develop a whiteboard application in which both the local user and the remote user should be able to draw simultaneously, is this possible? If possible then any logic?

I have already developed a code but in which i am not able to do this, when the remote user starts drawing the shape which i am drawing is being replaced by his shape and co-ordinates. This problem is only when both draw simultaneously.

any idea guys?

Here is my code

class  Paper extends JPanel implements MouseListener,MouseMotionListener,ActionListener
{
    static BufferedImage image;
    int bpressed;
    Color color;
    Point start;
    Point end;
    Point mp;
    Button elipse=new Button("elipse");
    Button rectangle=new Button("rect");
    Button line=new Button("line");
    Button empty=new Button("");
    JButton save=new JButton("Save");
    JButton erase=new JButton("Erase");
    String selected;
    int ex,ey;//eraser
    DatagramSocket dataSocket;
    JButton button = new JButton("test");
    Client client;
    Point p=new Point();
    int w,h;
    public Paper(DatagramSocket dataSocket) 
    {        
        this.dataSocket=dataSocket;
        client=new Client(dataSocket);
        System.out.println("paper");
        setBackground(Color.white);
        addMouseListener(this);
        addMouseMotionListener(this);
        color = Color.black; 
        setBorder(BorderFactory.createLineBorder(Color.black));         
        //save.setPreferredSize(new Dimension(100,20));
        save.setMaximumSize(new Dimension(75,27));
        erase.setMaximumSize(new Dimension(75,27));
    }

    public  void paintComponent(Graphics g) 
    {
        try
        {
        g.drawImage(image, 0, 0, this);
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.black);
        if(selected==("elipse"))
            g2.drawOval(start.x, start.y,(end.x-start.x),(end.y-start.y));
        else if(selected==("rect"))
            g2.drawRect(start.x, start.y, (end.x-start.x),(end.y-start.y));
        else if(selected==("line"))
            g2.drawLine(start.x,start.y,end.x,end.y);
        }
        catch(Exception e)
        {}
        }
    //Function to draw the shape on image
    public void draw()
    {
      Graphics2D g2 = image.createGraphics();
      g2.setPaint(color);
      if(selected=="line")
            g2.drawLine(start.x, start.y, end.x, end.y);
      if(selected=="elipse")
            g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y));
      if(selected=="rect")
            g2.drawRect(start.x, start.y, (end.x-start.x),(end.y-start.y));
      repaint();
      g2.dispose();
      start=null;
    } 

    //To add the point to the board which is broadcasted by the server  
    public  synchronized void addPoint(Point ps,String varname,String shape,String event) 
    {
        try
        {
            if(end==null)
                end = new Point();
            if(start==null)
                start = new Point();
            if(shape.equals("elipse"))
                selected="elipse";
            else if(shape.equals("line"))
                selected="line";
            else if(shape.equals("rect"))
                selected="rect";
            else if(shape.equals("erase"))
            {
                selected="erase";
                erase();
            }
            if(end!=null && start!=null)
            {
                if(varname.equals("end"))
                        end=ps;
                if(varname.equals("mp"))
                        mp=ps;          
                if(varname.equals("start"))
                        start=ps;
                if(event.equals("drag"))
                       repaint();
                else if(event.equals("release"))
                        draw();
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
} 
    //To set the size of the image
    public void setWidth(int x,int y)
    {
        System.out.println("("+x+","+y+")");
        w=x;
        h=y;
        image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
         Graphics2D g2 = image.createGraphics();
         g2.setPaint(Color.white);
         g2.fillRect(0,0,w,h);
         g2.dispose();
    }

    //Function which provides the erase functionality
    public void erase() 
    {
        Graphics2D pic=(Graphics2D) image.getGraphics();
        pic.setPaint(Color.white);
        pic.fillRect(start.x, start.y, 10, 10);
    }

    //Function to add buttons into the panel, calling this function returns a panel  
    public JPanel addButtons()
    {
        JPanel buttonpanel=new JPanel();
        JPanel row1=new JPanel();
        JPanel row2=new JPanel();
        JPanel row3=new JPanel();
        JPanel row4=new JPanel();
        buttonpanel.setPreferredSize(new Dimension(80,80));

        //buttonpanel.setMinimumSize(new Dimension(150,150));
        row1.setLayout(new BoxLayout(row1,BoxLayout.X_AXIS));
        row1.setPreferredSize(new Dimension(150,150));
        row2.setLayout(new BoxLayout(row2,BoxLayout.X_AXIS));
        row3.setLayout(new BoxLayout(row3,BoxLayout.X_AXIS));
        row4.setLayout(new BoxLayout(row4,BoxLayout.X_AXIS));
        buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.Y_AXIS));

        elipse.addActionListener(this);
        rectangle.addActionListener(this);
        line.addActionListener( this);
        save.addActionListener( this);
        erase.addActionListener( this);

        buttonpanel.add(Box.createRigidArea(new Dimension(10,10)));
        row1.add(elipse);
        row1.add(Box.createRigidArea(new Dimension(5,0)));
        row1.add(rectangle);
        buttonpanel.add(row1);
        buttonpanel.add(Box.createRigidArea(new Dimension(10,10)));

        row2.add(line);
        row2.add(Box.createRigidArea(new Dimension(5,0)));
        row2.add(empty);
        buttonpanel.add(row2);
        buttonpanel.add(Box.createRigidArea(new Dimension(10,10)));

        row3.add(save);
        buttonpanel.add(row3);
        buttonpanel.add(Box.createRigidArea(new Dimension(10,10)));

        row4.add(erase);
        buttonpanel.add(row4);
        return buttonpanel;
    }
    //To save the image drawn
    public void save()
    {
        try 
        {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
            JFileChooser fc = new JFileChooser();
            fc.showSaveDialog(this);        
            encoder.encode(image);
            byte[] jpgData = bos.toByteArray();
            FileOutputStream fos = new FileOutputStream(fc.getSelectedFile()+".jpeg");
            fos.write(jpgData);
            fos.close();
        //add replce confirmation here

        } 
        catch (IOException e) 
        {           
            System.out.println(e);
        }
    }
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseEntered(MouseEvent arg0) {

    }
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    public void mousePressed(MouseEvent e) 
    {
            if(selected=="line"||selected=="erase")
            {
                start=e.getPoint();
                client.broadcast(start,"start", selected,"press");
            }
            else if(selected=="elipse"||selected=="rect")
            {
                mp = e.getPoint();
                client.broadcast(mp,"mp", selected,"press");
            }
    }
    public void mouseReleased(MouseEvent e) 
    {
        if(start!=null)
        {
            if(selected=="line")
            {
                end=e.getPoint();           
                client.broadcast(end,"end", selected,"release");
            }
            else if(selected=="elipse"||selected=="rect")
            {
                end.x = Math.max(mp.x,e.getX());
                end.y = Math.max(mp.y,e.getY());
                client.broadcast(end,"end", selected,"release");
            }
            draw();
        }
    //start=null;
    }
    public void mouseDragged(MouseEvent e) 
    {
        if(end==null)
            end = new Point();

        if(start==null)
                start = new Point();

         if(selected=="line")
         {
            end=e.getPoint();
            client.broadcast(end,"end", selected,"drag");
         }
        else if(selected=="erase")
        {
             start=e.getPoint();
             erase();
            client.broadcast(start,"start", selected,"drag");
        }
        else if(selected=="elipse"||selected=="rect")
        {
            start.x = Math.min(mp.x,e.getX());
            start.y = Math.min(mp.y,e.getY());
            end.x = Math.max(mp.x,e.getX());
            end.y = Math.max(mp.y,e.getY());
            client.broadcast(start,"start", selected,"drag");
            client.broadcast(end,"end", selected,"drag");
        }
        repaint();
    }
    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    } 
    public void actionPerformed(ActionEvent e) 
    {
        if(e.getSource()==elipse)
            selected="elipse";
        if(e.getSource()==line)
            selected="line";    
        if(e.getSource()==rectangle)
            selected="rect";
        if(e.getSource()==save)
            save();
        if(e.getSource()==erase)
        {
            selected="erase";
            erase();
        }
    }
} 

class Button extends JButton
{
    String name;
    public Button(String name) 
    {
        this.name=name; 
        Dimension buttonSize = new Dimension(35,35);
        setMaximumSize(buttonSize);     
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        //g2.setStroke(new BasicStroke(1.2f));
        if (name == "line")     g.drawLine(5,5,30,30);   
        if (name == "elipse") g.drawOval(5,7,25,20);
        if (name== "rect") g.drawRect(5,5,25,23);

    }
}
+4  A: 

Try maintaining a panel for each user, and layer them on top of each other. As long as the backgrounds are transparent, you should see them all fine.

Edit: To achieve the layers, you could try JLayeredPane.

Russell Leggett
How to place it one above the other? plz
swift
I tried this, in a layered pane anyone panel can be active at a time so what if two user draws at a same time
swift
thanx russell, its working :)
swift
+1  A: 

I don't see any code there that handles requests arriving from the client. Assuming that is happening on a background thread, make sure you use SwingUtilities.invokeLater to make the changes on the EDT. Updating UI components from anywhere but the EDT will cause unpredictable behavior. See also Concurrency in Swing

Also, this sort of thing isn't going to work:

    if (name == "line")     g.drawLine(5,5,30,30);   

In Java, the == operator performs an identity comparison. It evaluates true if name and "line" are the same object. It will evaluate false if they reference different objects, even if they both have the same value. To compare equality, you need to use the .equals() method.

Devon_C_Miller
A: 

hi..wanted to see how this code works..but m not able to run it..have added an applet tag to it..plz tel me what all packages do i import??..and is there anything else to be done??

amaya
A: 

hi..wanted to see how this code works..but m not able to run it..have added an applet tag to it..plz tel me what all packages do i import??..and is there anything else to be done??

amaya