我想写一个基于网络的五子棋但是在鼠标单击事件中的server.SendMessage();出现从内部类中访问局部变量server;需要声明为final的错误!本人初学解决不了,谁能告送我如何不声明也可访问阿 部分代码如下有些乱见谅
import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
class WuZi extends JPanel implements ServerProtocol
{
private String ChessState;
String chessp;
String receive;
Server server;
private final int RATE=535/15;
private final int OFFSET=5;
BufferedImage boardimage;
BufferedImage white;
BufferedImage black;
BufferedImage selected;
private int selectedX=-1;
    private int selectedY=-1;
private boolean flag=false;
String[][] array=new String[15][15];
public WuZi(Server server)
{
      super();
  this.server=server;
  try
  {
boardimage=ImageIO.read(new File("image/board.jpg"));
white=ImageIO.read(new File("image/white.GIF"));
black=ImageIO.read(new File("image/black.GIF"));
selected=ImageIO.read(new File("image/Selected.GIF"));
addMouseListener(new MouseAdapter()
{
   public void mouseClicked(MouseEvent e)
{    
    int posX=0;
    int posY=0;
   if(flag)
{
        posX=(e.getX()-OFFSET)/RATE;
posY=(e.getY()-OFFSET)/RATE;
       chessp=MSG_CHESS+posX+","+posY+MSG_CHESS;
   server.SendMessage();
                   System.out.println(getSelectedX());
       System.out.println(getSelectedY());
   flag=!flag; }
else 
                {    
posX=Integer.parseInt(receive.substring(0));
    posX=Integer.parseInt(receive.substring(2));
}
   array[posX][posY]="w";
                   repaint();

}
public void mouseExited(MouseEvent e)
            {
               setSelectedX(-1);
   setSelectedY(-1);
   repaint();
}
});
   addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseMoved(MouseEvent e)
{
               int posX=(e.getX()-OFFSET)/RATE;
   int posY=(e.getY()-OFFSET)/RATE;
   setSelectedX(posX);
   setSelectedY(posY);
   repaint();           
}
});
  }
  catch (IllegalArgumentException ae)
  {
        ae.printStackTrace();
  }
  catch (IOException io)
  {
         io.printStackTrace();
  }
     for(int i=0;i<15;i++)
{  
      for(int j=0;j<15;j++)
   {
  array[i][j]="";
   }
}
}
public void Cleared()
{
         for(int i=0;i<15;i++)
{  
      for(int j=0;j<15;j++)
   {
  array[i][j]="";
   }
}
selectedX=-1;
selectedY=-1;
}
public void setChess(String ChessState)
{
this.ChessState=ChessState;
}
public String getChess(String ChessState)
{
return ChessState;
}
public int getSelectedX()
{
return selectedX;
}
public int getSelectedY()
{
return selectedY;
}
public void setSelectedX(int X)
{
         this.selectedX=X;
}
public void setSelectedY(int Y)
{
         this.selectedY=Y;
}
public void receive(String msg)
{
int x=0,y=0;
char c=0;
for(int i=0;i<msg.length();i++)
{
c=msg.charAt(i);
if(c==',')
{
System.out.println(msg.substring(i));
y=Integer.parseInt(msg.substring(i+1));
x=Integer.parseInt(msg.substring(0,i));
    break;
}
array[x][y]="b";
}
repaint();
}
public String setArray(int i,int j,String chess)
{
return array[i][j]=chess;
}
public void paint(Graphics g)
{
g.drawImage(boardimage,0,0,null);
if(selectedX!=-1 && selectedY!=-1)
{
           g.drawImage(selected,selectedX*RATE+OFFSET,selectedY*RATE+OFFSET,null);
}    
   for(int i=0;i<15;i++)
    {
       for(int j=0;j<15;j++)
{
      if(array[i][j].equals("w"))
       {
         g.drawImage(white,i*RATE+OFFSET,j*RATE+OFFSET,null);
   }
       else if(array[i][j].equals("b"))
        {
  g.drawImage(black,i*RATE+OFFSET,j*RATE+OFFSET,null);
        }
}
    }
}}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.PrintStream;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Server 
{
private Socket socket;
private final int SERVERPORT=30000;
private LKFrame lkf;
WuZi wuzi;
private MSOthread mso;
private MSRthread msr;
public Server(LKFrame lkf)
{
        this.lkf=lkf;
msr=new MSRthread(socket,lkf);
mso=new MSOthread(socket,lkf);
msr.start();
mso.start();

}
public void CreateServer()
{
try
{
 ServerSocket ss=new ServerSocket(SERVERPORT);
     socket=ss.accept();
}
catch (IOException io)
{
io.printStackTrace();
}
}
public void ExitLink(Socket s)
{
   try
   {
    if(s!=null)
   {
  s.close();
   }
   msr.Exit();
   mso.Exit();
   }
   catch (IOException ioe)
   {
           ioe.printStackTrace();
   }
}
public void ReadMessage() 
{
msr.start();
}
public void SendMessage() 
{
mso.start();
}
public void setWuzi(WuZi wuzi)
{
this.wuzi=wuzi;
}
}
class MSRthread extends Thread implements  ServerProtocol
{
private Socket s;
    private LKFrame lkf;
BufferedReader br=null;
String line=null;
public MSRthread(Socket s,LKFrame lkf)
{
this.s=s;
this.lkf=lkf;
}
public void run()
{
try
{
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
while((line=br.readLine())!=null)
{ if(line.startsWith(MSG_ROUND) && line.endsWith(MSG_ROUND))
{
                     String msg=line.substring(PROTOCOL_LEN,line.length()-PROTOCOL_LEN);
 lkf.boardpanel.receive(msg);
}
else if (line.startsWith(MSG_CHESS) && line.endsWith(MSG_CHESS))
{
                     String msg=line.substring(PROTOCOL_LEN,line.length()-PROTOCOL_LEN);     }
else if (line.startsWith(MSG_NAME) && line.endsWith(MSG_NAME))
{
 String msg=line.substring(PROTOCOL_LEN,line.length()-PROTOCOL_LEN);
} }
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
public void Exit()
{
try
{
if(br!=null)
{
br.close();
}
}
catch (IOException ioe)
{
          ioe.printStackTrace();
}
}
}
class MSOthread extends Thread implements ServerProtocol
{
private Socket s;
    private LKFrame lkf;
PrintWriter ps=null;
String line=null;
public MSOthread(Socket s,LKFrame lkf)
{
this.s=s;
this.lkf=lkf;
}
public void run()
{
try
{
ps=new PrintWriter(new PrintStream(s.getOutputStream())); ps.println(lkf.boardpanel.chessp);
ps.flush(); }
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
public void Exit()
{
          ps.close();
}
}

解决方案 »

  1.   

    你不要搞成匿名内部类不就得了吗!!把匿名类转换为一个有类名的类声明。不然你必须得用final修饰被匿名内部类引用的对象。
      

  2.   

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import java.awt.TextField;
    import java.awt.TextArea;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    public class ChatPanel
    {
    JFrame jframe=new JFrame("服务器");
    TestServer ts;
     TextField textfield=new TextField(30);
     JButton button=new JButton("发送");
    //ServerChat se=new ServerChat();
    //private JList chat=new JList();
    //private LinkedList<String> content=new LinkedList<String>();
     TextArea textcontent=new TextArea(10,10);
    private final int NUM=15;
        public void setTest(TestServer ts)
    {
    this.ts=ts;
    }
    public void init()
    {

    button.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent evt)
    {
    ts.send(textfield.getText());
    textcontent.append("你对客户端说:  "+textfield.getText()+"\n");
         textfield.setText("");
    }
    });
    textfield.setText("");     
    createframe();

    }
    public void createframe()
    {

    JPanel panel=new JPanel();
    JPanel textpanel=new JPanel();
    textpanel.add(textfield);
    textpanel.add(button);
    panel.setLayout(new BorderLayout());
    panel.add(textcontent);
    panel.add(textpanel,BorderLayout.SOUTH);
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jframe.setPreferredSize(new Dimension(400,300));
    jframe.add(panel);
    jframe.setVisible(true);
    jframe.pack(); }
    public static void main(String[] args) 
    {
    ChatPanel chat=new ChatPanel();
    chat.init();
        new TestServer(chat).ServerCreate();

             
    }
    }
    import java.io.BufferedReader;  
    import java.io.InputStreamReader;  
    import java.io.PrintWriter;  
    import java.io.PrintStream;  
    import java.net.ServerSocket;  
    import java.net.Socket;
    import java.io.IOException;
    import java.util.ArrayList;
    public class TestServer 
    {
    Socket socket;
    PrintWriter pw=null;
    ChatPanel chat;
    MyServerThread myser;
    ArrayList<Socket> list=new ArrayList<Socket>();
    private final int SERVERPORT=25000;
    public TestServer(ChatPanel chat)
    {
    this.chat=chat;
    chat.setTest(this);

    }
        public void ServerCreate()
    {
    try
    {
    ServerSocket ss=new ServerSocket(SERVERPORT);
            socket=ss.accept();
            System.out.println("有一个新连接");
            list.add(socket);
    myser=new MyServerThread(socket,chat);
    myser.start();
    }
    catch (IOException io)
    {
    io.printStackTrace();
    System.out.println("不好");
    System.exit(-1);
    }
    System.out.println("依然饭太稀");

    }
    public void send(String msg) 
    {
    try
    {
    pw=new PrintWriter(new PrintStream(socket.getOutputStream()));
        pw.println(msg);
    pw.flush();
    }
    catch (IOException io)
    {
    io.printStackTrace(); }

    }
    }
    class  MyServerThread extends Thread
    {

    ChatPanel chat;
    Socket socket=null;
    BufferedReader br=null;
    //PrintWriter pw=null;
    String line=null;
    public MyServerThread(Socket socket,ChatPanel chat)
    {
    this.socket=socket;
    this.chat=chat;
    }
    public void run()
    {
    try
    {
    br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
       while((line=br.readLine())!=null)
        {
                    if(line=="exit")
    {
    break;
    }
                  
          chat.textcontent.append("客户端对你说:  "+line+"\n");
      //System.out.println(line);
      
        }
    }
    catch (IOException io)
    {
    io.printStackTrace();
    } }}
    但是这个却可以为什么呢 ts.send();可以调用