2010-06-17 65 views
-1
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 

public class Draw extends JFrame { 


    /* 
    * Socket stuff 
    */ 
    static String host; 
    static int port; 
    static int localport; 
    DatagramSocket ds; 
    Socket socket; 

    Draw d; 
    Paper p = new Paper(ds); 


    public Draw(int localport, String host, int port) { 
     d = this; 

     this.localport = localport; 
     this.host = host; 
     this.port = port; 

     try { 
      ds = new DatagramSocket(localport); 
      InetAddress ia = InetAddress.getByName(host); 

      System.out.println("Attempting to connect DatagramSocket. Local port " 
        + localport + " , foreign host " + host + ", foreign port " + port + "..."); 

      ds.connect(ia, port); 

      System.out.println("Success, ds.localport: " + ds.getLocalPort() 
         + ", ds.port: " + ds.getPort() + ", address: " + ds.getInetAddress()); 

      Reciever r = new Reciever(ds); 

      r.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     getContentPane().add(p, BorderLayout.CENTER); 
     setSize(640, 480); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     int x = 0; 
     for (String s : args){ 
      if (x==0){ 
       localport = Integer.parseInt(s); 
       x++; 
      } 
      else if (x==1){ 
       host = s; 
       x++; 
      } 
      else if (x==2){ 
       port = Integer.parseInt(s); 
      } 
     } 
     Draw d = new Draw(localport, host, port); 
    } 
} 

class Paper extends JPanel { 

    DatagramSocket ds; 

    private HashSet hs = new HashSet(); 

    public Paper(DatagramSocket ds) { 
     this.ds=ds; 
     setBackground(Color.white); 
     addMouseListener(new L1(ds)); 
     addMouseMotionListener(new L2()); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     Iterator i = hs.iterator(); 
     while(i.hasNext()) { 
      Point p = (Point)i.next(); 
      g.fillOval(p.x, p.y, 2, 2); 
     } 
    } 

    private void addPoint(Point p) { 
     hs.add(p); 
     repaint(); 
    } 

    class L1 extends MouseAdapter { 

     DatagramSocket ds; 

     public L1(DatagramSocket ds){ 
      this.ds=ds; 
     } 

     public void mousePressed(MouseEvent me) { 







      addPoint(me.getPoint()); 
      Point p = me.getPoint(); 
      String message = Integer.toString(p.x) + " " + Integer.toString(p.y); 
      System.out.println(message); 



      try{ 

       byte[] data = message.getBytes("UTF-8"); 

       //InetAddress ia = InetAddress.getByName(ds.host); 

       String convertedMessage = new String(data, "UTF-8"); 

       System.out.println("The converted string is " + convertedMessage); 

       DatagramPacket dp = new DatagramPacket(data, data.length); 

       System.out.println(ds.getPort()); 
       //System.out.println(message); 
       //System.out.println(ds.toString()); 
       //ds.send(dp); 

       /*System.out.println("2Sending a packet containing data: " +data +" to " 
          + ia + ":" + d.port + "...");*/ 
      } catch (Exception e){ 
       e.printStackTrace(); 

      } 
     } 
    } 

    class L2 extends MouseMotionAdapter { 
     public void mouseDragged(MouseEvent me) { 
      addPoint(me.getPoint()); 
      Point p = me.getPoint(); 
      String message = Integer.toString(p.x) + " " + Integer.toString(p.y); 
      //System.out.println(message); 
     } 
    } 
} 

class Reciever extends Thread{ 

    DatagramSocket ds; 
    byte[] buffer; 

    Reciever(DatagramSocket ds){ 
     this.ds = ds; 
     buffer = new byte[65507]; 
    } 

    public void run(){ 
     try { 
      DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 
      while(true){ 
       try { 
        ds.receive(packet); 
        String s = new String(packet.getData()); 
        System.out.println(s); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

1

好,你提出的代码相当混乱那里,但你有这样的:

DatagramSocket ds; 
Socket socket; 

Draw d; 
Paper p = new Paper(ds); 

为引用类型字段的默认值是零,所以你打电话有效

new Paper(null) 

那么这将最终调用

new L1(null) 

这是为什么打电话L1中的正在抛出异常。该变量的值在每种情况下被传递

注 - 它不是像内的L1 ds与在Draw类的ds字段相关联。

没有看更多的细节,很难提出一个简单的解决方案 - 但它可能会涉及到等待,直到您创建DatagramSocket,然后再创建Paper

2

你这样做:

DatagramSocket ds; 
Socket socket; 

Draw d; 
Paper p = new Paper(ds); 

这里,ds是未初始化的,因而无效。纸将它传递给L1,因此L1中的ds也是空的。

0

当您声明Paper p = new Paper(ds);时,它将使用空DatagramSocket初始化纸张。

我想你想要做的是到该行更改为Paper p;然后之后ds = new DatagramSocket(localport);添加p = new Paper(ds);

刚抬起头的情况下,你想知道,Java中的一个常见的误解是:如果你分配new Paper(ds);和你以后的更改 ds(不是它的任何实例变量,你实际上改变了整个ds,如ds = new something),Java中的引用操作并不意味着最初用在纸上的ds实例会改变。

相关问题