我想写一个基于网络的五子棋但是在鼠标单击事件中的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();
}
}
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();
}
}
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();可以调用