2010-04-08 5 views
0

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

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 

} 

код, экземпляр класса userboard

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

} 
+1

Подпись метода выглядит правильно. Можете ли вы опубликовать код, в котором вы создаете UserBoard и добавляете его в окно верхнего уровня? – Adamski

+1

Я только что запустил ваш код (прокомментировал некоторые из классов, которые не были предоставлены) и был вызван метод Paintboard. Я думаю, вам нужно начать систематически упрощать свой код, пока он не будет работать для вас, а затем добавьте вещи по одному, пока не увидите, где это происходит. – Ash

ответ

2

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

Рекомендую вам прочитать tutorial for 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

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

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