目前只实现了一个人的客户端,由服务端进行判断输赢,返回结果!人数,可以自行增加!
我使用多线程的方式,即每次押注都会通知服务器端新开线程,在参与人数比较少的情况下,不会又问题!但是如果参与人数比较多,由于我的基准值,也就是初始金钱值使用的是同一个静态变量,必然有可能会造成金钱变化的不及时,并且,所有人用的也都是同一个金钱值,当然也不太合理!
还有许多控件的功能并没有完全实现!
总算是完成了自己的第一个GUI程序吧!
java 的学习至此也要告一段落了,下一阶段该学什么呢?
//客户端
package cgame;
import java.awt.*;
import java.awt.event.*;
public class ClientGame extends Frame implements WindowListener{
public TextArea ta;
public ClientGame(){
super("骰子游戏客户端");
MenuUI bar=new MenuUI(this);//设置框架菜单栏
//注册时间监听//第一个this表示自己,给自己注册监听器,是谁,还是自己(第二个this)
//注册监听器的意思就是说,被监听对象有动作时,自动执行监听器的对应函数
this.addWindowListener(this);
//设置主界面
initUI();
this.setSize(400,400);
this.setVisible(true);
}
private void initUI(){
//初始化上部
Panel pNorth=initNorth();
this.add(pNorth,BorderLayout.NORTH);
//初始化右侧
Panel pEast=initEast();
this.add(pEast, BorderLayout.EAST);
//初始化中部
Panel pCenter=initCenter();
this.add(pCenter, BorderLayout.CENTER);
}
//初始化上部函数,返回上部面板
private Panel initNorth(){
Panel p=new Panel();//新建一个面板对象
//设置布局管理器
BorderLayout b1=new BorderLayout();
p.setLayout(b1);
//创建控件
Label lbTitle=new Label("欢迎加入骰子大战");
//添加一个多行文本空间
ta=new TextArea();//换成类属性,这个每个版块都可以调用了
ta.append("系统提示信息:\n");
ta.append("初始金钱:1000\n");
//设置不可编辑
ta.setEditable(false);
//添加到容器
p.add(lbTitle,BorderLayout.NORTH);
p.add(ta,BorderLayout.CENTER);
//设置背景色
p.setBackground(Color.GRAY);
return p;
}
//初始化右侧函数,返回右侧面板
private Panel initEast(){
Panel p=new Panel();
//设置布局管理器为边界式
BorderLayout bl=new BorderLayout();
p.setLayout(bl);
//创建控件
Label lbTitle=new Label("当前在线:");
List listUser=new List();
listUser.add("所有人");
listUser.add("Tom");
listUser.add("Mike");
//添加控件到容器
p.add(lbTitle, BorderLayout.NORTH);
p.add(listUser,BorderLayout.CENTER);
//设置背景色
p.setBackground(Color.CYAN);
return p;
}
//初始化中部函数,返回中部面板
private Panel initCenter(){
Panel p=new Panel();
//设置布局管理器
GridLayout gl=new GridLayout(4,4);
p.setLayout(gl);
//创建控件对象,并依次添加
String[] content={
"回显功能","200","192.168.1.108","Txt3",
"回显功能","Label1","Label2","Label3",
"Label4","Label5","Label6","Label7",
"压大","压小","聊天","Button3",
};
//为了方便调用标签组件,构造Label组件放在构造txt前面
Label[] DicNum=new Label[8];
int j=0;
for(int i=4;i<12;i++,j++){
DicNum[j]=new Label(content[i]);
p.add(DicNum[j]);
}
//构造Txt组件
TextField[] userIP=new TextField[4];
for(int i=0;i<4;i++){
userIP[i]=new TextField(content[i]);
p.add(userIP[i]);
}
//注册Text0的监视器,这里实际是userIP[0]
TextToLabel ttl=new TextToLabel(userIP[0],DicNum[0],ta);//将事件源文本框传过去
userIP[0].addActionListener(ttl);
//构造 button组件
j=0;
Button[] btn=new Button[4];//这里仅仅只是声明,还不算初始化
for(int i=12;i<16;i++,j++){
btn[j]=new Button(content[i]);
p.add(btn[j]);
}
//为压大和压小按钮注册监听器,将文本框1都传过去,按钮和多行文本控件也要传过去
//文本框1押注金额0-3,传递的参数:文本框1:输押注金额,文本框2:输ip,
//按钮:压大小,多行文本:显示提示
DicGame dg=new DicGame(userIP[1],userIP[2],btn[0],btn[1],ta);
btn[0].addActionListener(dg);
btn[1].addActionListener(dg);
btn[2].addActionListener(dg);
return p;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
ClientGame ss=new ClientGame();
}
@Override
public void windowActivated(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowClosed(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowClosing(WindowEvent arg0) {
// TODO 自动生成的方法存根
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowDeiconified(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowIconified(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowOpened(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
}
package cgame;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class DicGame implements ActionListener {
Label lab1;
TextArea ta;
TextField txt1,txt2;//txt1用于押注金额,txt2用于输入ip
Button btn0,btn1,btn2;
static int money=1000;//初始金额
public DicGame(TextField txt1,TextField txt2,Button btn0,Button btn1,TextArea ta){
this.txt1=txt1;
this.txt2=txt2;
this.btn0=btn0;
this.btn1=btn1;
this.btn2=btn2;
this.ta=ta;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
Socket socket=null;//客户端 声明网络连接对象
InputStream is=null;
OutputStream os=null;
//服务器端IP地址在txt2中,通过函数来得到
String serverIP=addIP(txt2);
//服务器端口号
int port=10000;
//发送内容就限定为byte型的0和1,压大是1,压小是0
//两个按钮注册的是同一个监听对象,就需要得到事件源,判断是哪个按钮事件
String data=null;
Button b=(Button)e.getSource();
if(b==btn0)
data="1";//压大
else if(b==btn1)
data="0";//压小
//获得押注金额,txt1内容转换为字符串
String stake=txt1.getText();
//将多个String连接成一个字符串,大小和押注金额
String sdata=linkData(data,stake);
showLabel(sdata);
try{
//建立连接
socket=new Socket(serverIP,port);
//发送数据
//就简单理解为,此操作后,os就是连接输出流,输出内容写入到输出流os中即可
os=socket.getOutputStream();//得到网络连接的输出流
os.write(sdata.getBytes());
//接受数据
is=socket.getInputStream();//同上理解,得到连接输入流
byte[]d=new byte[1024];
int n=is.read(d);
//输出反馈数据
String s=new String(d,0,n);//反馈数据即为此s字符串
showLabel(s);
//解析s字符串,并输出结果
showResult(s);
}catch(Exception e1){
e1.printStackTrace();
}finally{
try{
//关闭流和连接
is.close();
os.close();
socket.close();
}catch(Exception e2){}
}
}
String addIP(TextField txt2){
return txt2.getText();//这里对IP地址的非法情况不做判断,由连接异常来反应
}
//将发送数据都整合到一个字符串里面
String linkData(String str1,String str2){
//StringBuffer sb=new StringBuffer(str1);
//sb.append(str2);
return str1+" "+str2;//String本来就重载了+,可以直接使用
}
//反馈数据解析并显示函数
void showResult(String s){
StringTokenizer an=new StringTokenizer(s," ");//空格作为分隔依据
String str1=an.nextToken();
String str2=an.nextToken();//我这种简单的网络协议就不需要用循环了
//数据解析完成后显示
showLabel(str1);showLabel("显示么?");
if(str1=="0"){
showLabel("输");
}else {
showLabel("赢");
}
showLabel("剩余金钱:");
showLabel(str2);
}
//将字符串在多行文本上显示
public void showLabel(String s){
ta.append(s+'\n');
}
}
package cgame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;
public class MenuUI implements ActionListener {
MenuItem versionMi;
MenuItem authorMi;
Frame frm;
public MenuUI(Frame frm){
this.frm=frm;//传递框架对象,不然弹出对话框的时候,找不到依赖对话框
MenuBar bar=new MenuBar();//创建菜单栏
//创建菜单
Menu fileMenu=new Menu("文件");
Menu helpMenu=new Menu("帮助");
Menu aboutMenu=new Menu("关于");
//创建菜单项
MenuItem openMi=new MenuItem("打开");
MenuItem printMi=new MenuItem("打印");
MenuItem exitMi=new MenuItem("退出");
MenuItem helpMi=new MenuItem("帮助");
versionMi=new MenuItem("版本");
authorMi=new MenuItem("作者");
//添加到菜单
fileMenu.add(openMi);
fileMenu.add(printMi);
fileMenu.add(exitMi);
aboutMenu.add(versionMi);
aboutMenu.add(authorMi);
helpMenu.add(helpMi);
helpMenu.add(aboutMenu);
//添加到菜单栏
bar.add(fileMenu);
bar.add(helpMenu);
//设置菜单栏
frm.setMenuBar(bar);
//注册同一个监听器,方法内部判断发生事件的菜单项,然后进行不同的逻辑处理
versionMi.addActionListener(this);
authorMi.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
//获得发生事件的控件
MenuItem mi=(MenuItem)e.getSource();
//判断,弹出有模式对话框
if(mi==versionMi){
JOptionPane.showMessageDialog(frm, "v1.2\n单机掷骰子","版本", JOptionPane.INFORMATION_MESSAGE);
}
else if(mi==authorMi){
JOptionPane.showMessageDialog(frm, "Andy\n座右铭:勤耕不辍,方得始终!","作者", JOptionPane.INFORMATION_MESSAGE);
}
}
}
package cgame;
import java.awt.*;
import java.awt.event.*;
public class TextToLabel implements ActionListener {
TextField txt1;
Label Lab1;
TextArea ta;
//构造方法要将事件源文本框传过来
public TextToLabel(TextField txt1,Label Lab1,TextArea ta){
this.txt1=txt1;
this.Lab1=Lab1;
this.ta=ta;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
String word=txt1.getText();//获得输入文本
Lab1.setText(word);
ta.append(word+'\n');
System.out.println(word);
}
}
//*********************************************************
//服务器端
package sgame;
import java.awt.*;
import java.awt.event.*;
public class DicGame implements ActionListener {
Label lab1;
TextArea ta;
TextField txt2;
Button btn0,btn1;
static int money=1000;//初始金额
public DicGame(TextField txt2,Label lab1,Button btn0,Button btn1,TextArea ta){
this.lab1=lab1;
this.txt2=txt2;
this.btn0=btn0;
this.btn1=btn1;
this.ta=ta;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
//showLabel(changeChar(money),ta);//显示初始金额
int diceNum=0;
int type=0;
//判断押宝类型
//获得按钮对象
Button b=(Button)e.getSource();
if(b==btn0)
type=1;//1压大
else if(b==btn1)
type=2;//2压小
int cMoney=changeInt();
boolean success;
//游戏过程,应该是不需要死循环的
//输入非法,则程序直接完成了,GUI线程本身是死循环了,输入正确执行else
if(!checkCMoney(money,cMoney)){
showLabel("输入非法",ta);
}
//输入有效后,开始掷骰子
else {
diceNum=doDice();//掷骰子
//判断胜负
success=isSuccess(type,diceNum);
//金钱变化
money=changeMoney(money,success,cMoney);
//游戏结束
if(money<=0){
showLabel("请充值!",ta);
}
}
}
//定义一个将整形转换为字符串的函数
public String changeChar(int i){
return Integer.toString(i);
}
//将字符串在多行文本上显示
public void showLabel(String s,TextArea ta){
ta.append(s+'\n');
}
//将文本框获得内容转为整形数
public int changeInt(){
String s=txt2.getText();
return Integer.parseInt(s);
}
//判定下注金额是否非法
public static boolean checkCMoney(int money,int cMoney){
if(cMoney<=0)
return false;
else if(cMoney<=money)
return true;
else
return false;
}
//掷骰子,返回点数和
public static int doDice(){
int n=(int)(Math.random()*6)+1;
int n1=(int)(Math.random()*6)+1;
int n2=(int)(Math.random()*6)+1;
return n+n1+n2;
}
//胜负判断
public boolean isSuccess(int type,int diceNum){
//计算庄家类型
int bankerType=0;
if(diceNum<=9){
bankerType=2;
}else{
bankerType=1;
}
if(bankerType==type){
showLabel("赢",ta);
return true;
}
else{
showLabel("输",ta);
return false;
}
}
//金钱变化
public int changeMoney(int money,boolean success,int cMoney){
if(success){
money+=cMoney;
}else{
money-=cMoney;
}
showLabel("当前金钱:",ta);
showLabel(changeChar(money),ta);
return money;
}
}
package sgame;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class LogicThread extends Thread {
Socket socket;
TextArea ta;
InputStream is;
OutputStream os;
int dicNum,result,nowMoney;//返回结果为result nowMoney
public LogicThread(Socket socket,TextArea ta){
this.socket=socket;
this.ta=ta;
start();
}
public void run(){
byte[]b=new byte[1024];
try{
//得到连接中的输入输出流
os=socket.getOutputStream();
is=socket.getInputStream();
//读取数据
int n=is.read(b);
//逻辑处理
String str=sHandle(b,n);//n代表实际读取字节数
//发送str内容
os.write(str.getBytes());
ta.append("&&&&&&&&");
ta.append(str);
System.out.println("&*&*&*线程到这里就该结束了");
}catch(Exception e){
e.printStackTrace();
}finally{
close();
}
}
//关闭流和连接
private void close(){
try{
//关闭流和连接
System.out.println("&*&*&*&*&*");
os.close();
is.close();
socket.close();
}catch(Exception e){}
}
//逻辑处理函数
String sHandle(byte[] b,int n){
//首先要将b数组解析出来
String str=new String(b,0,n);//将字节数组转换为字符串
ta.append(str+'\n');
StringTokenizer ad=new StringTokenizer(str," ");//空格分隔
String str1=ad.nextToken();//实际则代表了客户端发来的压大小信息
String str2=ad.nextToken();//代表客户所押金额
ta.append("********");
ta.append(str1+'\n');
ta.append(str2+'\n');
//判断客户所押为大还是小,并得到押注金额,将字符串转变为整型数
int type=Integer.parseInt(str1);
int cMoney=Integer.parseInt(str2);
System.out.println(type);
System.out.println(cMoney);
ta.append("*********");
//判断押注金额是否非法,调用DicGame类中的静态变量和方法
boolean success;
System.out.println("静态变量金钱:"+DicGame.money);
if(!DicGame.checkCMoney(DicGame.money,cMoney)){
ta.append("输入非法");//将字符串在多行文本空间中显示
result=0;
nowMoney=DicGame.money;
}
else{//输入有效开始判断大小
dicNum=DicGame.doDice();
//判断胜负
success=isSuccess(type,dicNum);
//金钱变化,这里金钱使用的是静态变量,但是还是值传递的方式,
//每次不管怎么变,原来的静态变量没有变,所以总是以1000为基准
nowMoney=changeMoney(DicGame.money,success,cMoney);
//游戏结束
if(nowMoney<=0)
ta.append("请充值!\n");
}
//游戏至此就已经完成,转换要返回的数据并返回
return Integer.toString(result)+" "+Integer.toString(nowMoney);
}
//胜负判断
public boolean isSuccess(int type,int dicNum){
//计算庄家类型
int bankerType=0;
if(dicNum<=9){
bankerType=0;
}else{
bankerType=1;
}
if(bankerType==type){
ta.append("赢\n");
result=1;
return true;
}
else{
ta.append("输\n");
result=0;
return false;
}
}
//金钱变化
public int changeMoney(int money,boolean success,int cMoney){
if(success){
money+=cMoney;
}else{
money-=cMoney;
}
System.out.println("变化后的金钱:");
System.out.println(money);
ta.append("剩余金钱:\n");;
//将剩余金钱转换为字符串并显示
ta.append(Integer.toString(money));
DicGame.money=money;//金钱变化后,要修改基准值
return money;
}
}
package sgame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;
public class MenuUI implements ActionListener {
MenuItem versionMi;
MenuItem authorMi;
Frame frm;
public MenuUI(Frame frm){
this.frm=frm;//传递框架对象,不然弹出对话框的时候,找不到依赖对话框
MenuBar bar=new MenuBar();//创建菜单栏
//创建菜单
Menu fileMenu=new Menu("文件");
Menu helpMenu=new Menu("帮助");
Menu aboutMenu=new Menu("关于");
//创建菜单项
MenuItem openMi=new MenuItem("打开");
MenuItem printMi=new MenuItem("打印");
MenuItem exitMi=new MenuItem("退出");
MenuItem helpMi=new MenuItem("帮助");
versionMi=new MenuItem("版本");
authorMi=new MenuItem("作者");
//添加到菜单
fileMenu.add(openMi);
fileMenu.add(printMi);
fileMenu.add(exitMi);
aboutMenu.add(versionMi);
aboutMenu.add(authorMi);
helpMenu.add(helpMi);
helpMenu.add(aboutMenu);
//添加到菜单栏
bar.add(fileMenu);
bar.add(helpMenu);
//设置菜单栏
frm.setMenuBar(bar);
//注册同一个监听器,方法内部判断发生事件的菜单项,然后进行不同的逻辑处理
versionMi.addActionListener(this);
authorMi.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
//获得发生事件的控件
MenuItem mi=(MenuItem)e.getSource();
//判断,弹出有模式对话框
if(mi==versionMi){
JOptionPane.showMessageDialog(frm, "v1.2\n单机掷骰子","版本", JOptionPane.INFORMATION_MESSAGE);
}
else if(mi==authorMi){
JOptionPane.showMessageDialog(frm, "Andy\n座右铭:勤耕不辍,方得始终!","作者", JOptionPane.INFORMATION_MESSAGE);
}
}
}
package sgame;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
public class ServiceGame extends Frame implements WindowListener{
static public TextArea ta;//设置为公共属性,大家都可以调用来显示提示信息
public ServiceGame(){
super("骰子游戏服务端");
MenuUI bar=new MenuUI(this);//设置框架菜单栏
//注册时间监听//第一个this表示自己,给自己注册监听器,是谁,还是自己(第二个this)
//注册监听器的意思就是说,被监听对象有动作时,自动执行监听器的对应函数
this.addWindowListener(this);
//设置主界面
initUI();
this.setSize(400,400);
this.setVisible(true);
}
private void initUI(){
//初始化上部
Panel pNorth=initNorth();
this.add(pNorth,BorderLayout.NORTH);
//初始化右侧
Panel pEast=initEast();
this.add(pEast, BorderLayout.EAST);
//初始化中部
Panel pCenter=initCenter();
this.add(pCenter, BorderLayout.CENTER);
}
//初始化上部函数,返回上部面板
private Panel initNorth(){
Panel p=new Panel();//新建一个面板对象
//设置布局管理器
BorderLayout b1=new BorderLayout();
p.setLayout(b1);
//创建控件
Label lbTitle=new Label("欢迎加入骰子大战");
//添加一个多行文本空间
ta=new TextArea();//换成类属性,这个每个版块都可以调用了
ta.append("系统提示信息:\n");
ta.append("初始金钱:1000\n");
//设置不可编辑
ta.setEditable(false);
//添加到容器
p.add(lbTitle,BorderLayout.NORTH);
p.add(ta,BorderLayout.CENTER);
//设置背景色
p.setBackground(Color.GRAY);
return p;
}
//初始化右侧函数,返回右侧面板
private Panel initEast(){
Panel p=new Panel();
//设置布局管理器为边界式
BorderLayout bl=new BorderLayout();
p.setLayout(bl);
//创建控件
Label lbTitle=new Label("当前在线:");
List listUser=new List();
listUser.add("所有人");
listUser.add("Tom");
listUser.add("Mike");
//添加控件到容器
p.add(lbTitle, BorderLayout.NORTH);
p.add(listUser,BorderLayout.CENTER);
//设置背景色
p.setBackground(Color.CYAN);
return p;
}
//初始化中部函数,返回中部面板
private Panel initCenter(){
Panel p=new Panel();
//设置布局管理器
GridLayout gl=new GridLayout(4,4);
p.setLayout(gl);
//创建控件对象,并依次添加
String[] content={
"Txt1","Txt2","Txt3","Txt4",
"Label1","Label2","Label3","Label4",
"Label5","Label6","Label7","Label8",
"压大","压小","Button3","Button4",
};
//为了方便调用标签组件,构造Label组件放在构造txt前面
Label[] DicNum=new Label[8];
int j=0;
for(int i=4;i<12;i++,j++){
DicNum[j]=new Label(content[i]);
p.add(DicNum[j]);
}
//构造Txt组件
TextField[] userIP=new TextField[4];
for(int i=0;i<4;i++){
userIP[i]=new TextField(content[i]);
p.add(userIP[i]);
}
//注册Text1的监视器,这里实际是userIP[0]
TextToLabel ttl=new TextToLabel(userIP[0],DicNum[0],ta);//将事件源文本框传过去
userIP[0].addActionListener(ttl);
//构造 button组件
j=0;
Button[] btn=new Button[4];//这里仅仅只是声明,还不算初始化
for(int i=12;i<16;i++,j++){
btn[j]=new Button(content[i]);
p.add(btn[j]);
}
//为压大和压小按钮注册监听器,将标签2,3,4和文本框1都传过去,按钮也要传过去
DicGame dg=new DicGame(userIP[1],DicNum[1],btn[0],btn[1],ta);
btn[0].addActionListener(dg);
btn[1].addActionListener(dg);
return p;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
ServiceGame ss=new ServiceGame();//这一步只是生成了界面
//就是说只是开启了一个线程来做界面这件事情,主函数,也就是主线程,还要往下执行
//System.out.println("hello");
ServerSocket serverSocket=null;
Socket socket=null;
//监听端口号
int port=10000;
try{
//建立连接
serverSocket=new ServerSocket(port);//监听代码
ta.append("服务器已启动\n");
int i=1;
while(i>0){
//获得连接到服务器端的客户端连接,释放服务器端口,拥塞方法
socket=serverSocket.accept();
//启动线程
System.out.println("线程开始");
LogicThread tt=new LogicThread(socket,ta);
System.out.println("第"+i+"次循环");
i++;
System.out.println("线程结束了!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//关闭连接
serverSocket.close();
}catch(Exception e){}
}
}
@Override
public void windowActivated(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowClosed(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowClosing(WindowEvent arg0) {
// TODO 自动生成的方法存根
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowDeiconified(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowIconified(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void windowOpened(WindowEvent arg0) {
// TODO 自动生成的方法存根
}
}
package sgame;
import java.awt.*;
import java.awt.event.*;
public class TextToLabel implements ActionListener {
TextField txt1;
Label Lab1;
TextArea ta;
//构造方法要将事件源文本框传过来
public TextToLabel(TextField txt1,Label Lab1,TextArea ta){
this.txt1=txt1;
this.Lab1=Lab1;
this.ta=ta;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
String word=txt1.getText();//获得输入文本
Lab1.setText(word);
ta.append(word+'\n');
System.out.println(word);
}
}