JPanel метод рисования не вызывается, почему? - PullRequest
0 голосов
/ 08 апреля 2010

Когда я запускаю этот код, метод paintComponent не вызывается. Это может быть очень простая ошибка, но я не знаю, почему это, плз.

package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

 class   Userboard extends JPanel 
{
    static BufferedImage image;
    String shape;
    Point start;
    Point end;
    Point mp;
    String selected;
    int ex,ey;//eraser
    int w,h;
    public Userboard() 
    {        

        setOpaque(false);
        System.out.println("paper");
        setBackground(Color.white);

        setBorder(BorderFactory.createLineBorder(Color.black));         
    }
    public  void paintComponent(Graphics g) 
    {
           System.out.println("userboard-paint");
        try
        {

            //g.drawImage(image, 0, 0, this);
            Graphics2D g2 = (Graphics2D)g;
            g2.setPaint(Color.black);
            if(start!=null && end!=null)
            {
                if(selected==("elipse"))
                {
                    System.out.println("userboard-elipse");
                    g2.drawOval(start.x, start.y,(end.x-start.x),(end.y-start.y));
                    System.out.println("userboard-elipse drawn");
                }
                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()
    {
        System.out.println("Userboard-draw");
        System.out.println(selected);
        System.out.println(start);
        System.out.println(end);
        Graphics2D g2 = image.createGraphics();
        g2.setPaint(Color.black);
        if(start!=null && end!=null)
        {
            if(selected=="line")
                    g2.drawLine(start.x, start.y, end.x, end.y);
            else if(selected=="elipse")
            {
                System.out.println("userboard-elipse");
                g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y));
                System.out.println("userboard-elipse drawn");
            }
            else if(selected=="rect")
                    g2.drawRect(start.x, start.y, (end.x-start.x),(end.y-start.y));
        }
        start=null;
        repaint();
        g2.dispose();
    } 
    //To add the point to the board which is broadcasted by the server  
    public   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"))
                this.selected="elipse";
            else if(shape.equals("line"))
                this.selected="line";
            else if(shape.equals("rect"))
                this.selected="rect";
            else if(shape.equals("erase"))
                erase();

            if(end!=null && start!=null)
            {           
                if(varname.equals("end"))
                        end=ps;
                else if(varname.equals("mp"))
                        mp=ps;          
                else if(varname.equals("start"))
                        start=ps;

                if(event.equals("drag"))
                       repaint();
                else if(event.equals("release"))
                        draw();     
            }
              repaint();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
} 
    //Function which provides the erase functionality
    public  void erase() 
    {
        Graphics2D pic=(Graphics2D) image.getGraphics();
        pic.setPaint(Color.white);
        if(start!=null)
        pic.fillRect(start.x, start.y, 10, 10);
    }

    //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_ARGB);
    }
    //Function to add buttons into the panel, calling this function returns a panel  

}

код, который создает экземпляр класса пользователя*

public class Client extends Thread 
{
    Point point;
    Paper paper;  
    Userboard userboard;

    DatagramSocket datasocket=null;
    public Client(DatagramSocket datasocket)
    {
            this.datasocket=datasocket;
    }

    //This function is to create the JFrame 
    public void createFrame()
    {
        JLayeredPane layerpane=new JLayeredPane();
         JFrame frame=new JFrame("Whiteboard");
         paper= new Paper(datasocket); 
         userboard=new Userboard();
        frame.setLayout(new BorderLayout());
        layerpane.setLayout(new BorderLayout());


        layerpane.add(paper,BorderLayout.CENTER);
        layerpane.add(userboard,BorderLayout.CENTER);//Panel where remote user draws 

        frame.add(paper.addButtons(),BorderLayout.WEST);
        frame.add(layerpane,BorderLayout.CENTER);


         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setSize(640, 480);
         frame.addWindowListener(new WindowAdapter() 
         {
             public void windowOpened(WindowEvent e) {}
             public void windowClosing(WindowEvent e) 
             {
                 Draw draw=new Draw();
                draw. close();
             }          
         });
         paper.setWidth(frame.getWidth(),frame.getHeight());
         userboard.setWidth(frame.getWidth(),frame.getHeight());
         frame.setVisible(true);
    }

    /*
     * This function is overridden from the thread class
     * This function listens for incoming packets from the server 
     * which contains the points drawn  by the other client
    */
    public void run () 
    {       
            while (true) 
            {
                try 
                {
                    byte[] buffer = new byte[512];
                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                    datasocket.receive(packet);
                    InputStream in=new ByteArrayInputStream(packet.getData(), packet.getOffset(),packet.getLength());
                    DataInputStream din=new DataInputStream(in);              
                    int x=din.readInt();
                    int y=din.readInt();
                    String varname=din.readLine();
                    String var[]=varname.split("-",3);
                    point=new Point(x,y);
                    userboard.addPoint(point, var[0], var[1],var[2]);                   
              }
                catch (IOException ex) 
                {
                    ex.printStackTrace();
                }
        }       
    }

    //This function is to broadcast the newly drawn point to the server 
    public   void  broadcast (Point p,String varname,String shape,String event) 
    {
        try
        {
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            DataOutputStream dos=new DataOutputStream(baos);
            dos.writeInt(p.x);
            dos.writeInt(p.y);
            dos.writeBytes(varname);
            dos.writeBytes("-");
            dos.writeBytes(shape);
            dos.writeBytes("-");
            dos.writeBytes(event);
            dos.close();
            byte[]data=baos.toByteArray();
            InetAddress ip=InetAddress.getByName("10.123.97.125");
            DatagramPacket packet=new DatagramPacket(data, data.length,ip , 8002);
            datasocket.send(packet);
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

}

Ответы [ 2 ]

2 голосов
/ 08 апреля 2010

Я думаю, что вы добавляете две панели к своей многослойной панели неправильно.

Я рекомендую прочитать учебник для JLayeredPane .

При добавлении в JLayeredPane вы не должны давать подсказку по макету (в данном случае не имеет значения), а должны указывать идентификатор слоя, на котором вы хотите добавить свой компонент.

Из учебника:

for (int i = 0; i < ...number of labels...; i++) {
    JLabel label = createColoredLabel(...);
    layeredPane.add(label, new Integer(i));
    ...
}

В вашем случае вы, вероятно, хотите что-то подобное:

layerpane.add( paper,     new Integer(0));
layerpane.add( userboard, new Integer(1));//Panel where remote user draws 

Я не гарантирую, что это единственная проблема, но если действительно что-то не так со слоем, это может объяснить, почему ваш метод UserBoard.paintComponent () никогда не вызывается.

0 голосов
/ 08 апреля 2010

Если вы просто собираетесь использовать панель для собственного рисунка, просто переопределите рисование (Grapics). Я считаю, что это проще. Если вы хотите, чтобы JPanel отображал границу, вызовите paintBorder в paint (Graphics) после вашего рисунка.

...