A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 安卓安小虾 中级黑马   /  2014-11-9 17:40  /  1113 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


        /**
         * @param args
         */

        import java.awt.BorderLayout;
        import java.awt.Button;
        import java.awt.Color;
        import java.awt.Font;
        import java.awt.Frame;
        import java.awt.Panel;
        import java.awt.TextArea;
        import java.awt.TextField;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import java.awt.event.WindowAdapter;
        import java.awt.event.WindowEvent;
        import java.io.BufferedWriter;
        import java.io.ByteArrayOutputStream;
        import java.io.FileInputStream;
        import java.io.FileWriter;
        import java.io.IOException;
        import java.net.DatagramPacket;
        import java.net.DatagramSocket;
        import java.net.InetAddress;
        import java.net.SocketException;
        import java.text.SimpleDateFormat;
        import java.util.Date;

public class GUI_Chat extends Frame {

                private TextField tf;
                private Button send;
                private Button clear;
                private Button log;
                private Button shake;
                private TextArea sendText;
                private TextArea viewText;
                private DatagramSocket socket;
                private BufferedWriter bw;

                /**
                 * @param args
                 */
                public GUI_Chat() {
                        init();
                        southPanel();
                        centerPanel();
                        event();
                }

                private void event() {
                        this.addWindowListener(new WindowAdapter() {
                                @Override
                                public void windowClosing(WindowEvent e) {
                                        try {
                                                socket.close();
                                                bw.close();
                                        } catch (IOException e1) {
                                                e1.printStackTrace();
                                        }
                                        System.exit(0);
                                }
                        });
                       
                        send.addActionListener(new ActionListener() {
                               
                                @Override
                                public void actionPerformed(ActionEvent e) {
                                        try {
                                                send();
                                        } catch (IOException e1) {
                                                e1.printStackTrace();
                                        }
                                }

                        });
                       
                        clear.addActionListener(new ActionListener() {
                               
                                @Override
                                public void actionPerformed(ActionEvent e) {
                                        viewText.setText("");
                                }
                        });
                       
                        log.addActionListener(new ActionListener() {
                               
                                @Override
                                public void actionPerformed(ActionEvent e) {
                                        try {
                                                logFile();
                                        } catch (IOException e1) {
                                                e1.printStackTrace();
                                        }
                                }

                        });
                       
                        shake.addActionListener(new ActionListener() {
                               
                                @Override
                                public void actionPerformed(ActionEvent e) {
                                        try {
                                                send(new byte[]{-1},tf.getText());
                                        } catch (IOException e1) {
                                               
                                                e1.printStackTrace();
                                        }
                                }

                        });
                }

                private void shake() throws InterruptedException {
                        int x = this.getLocation().x;
                        int y = this.getLocation().y;
                        for(int i = 0; i < 20; i++) {
                                this.setLocation(x +  20, y + 20);
                                Thread.sleep(20);
                                this.setLocation(x -  20, y + 20);
                                Thread.sleep(20);
                                this.setLocation(x +  20, y - 20);
                                Thread.sleep(20);
                                this.setLocation(x -  20, y - 20);
                                Thread.sleep(20);
                                this.setLocation(x, y);
                        }
                }
               
                private void logFile() throws IOException {
                        bw.flush();                                                                                                //刷新缓冲区
                        FileInputStream fis = new FileInputStream("config.txt");//读取配置文件
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();//创建内存缓冲区
                        int len;
                        byte[] arr = new byte[1024];                                                        //创建字节数组
                        while((len = fis.read(arr)) != -1) {                                        //将文件上的数据读到字节数组中
                                baos.write(arr, 0, len);                                                        //将字节数组中的数据写到内存中
                        }
                        viewText.setText(baos.toString());                                                //转换成字符串
                        fis.close();
                }
                private void send(byte[] arr,String ip) throws IOException {
                        DatagramPacket packet =                                                 //创建Packet,相当于集装箱
                                        new DatagramPacket(arr, arr.length, InetAddress.getByName(ip), 8888);
                        socket.send(packet);
                }
                private void send() throws IOException {
                        String message = sendText.getText();                        //获取发送区域的文件内容
                        String ip = tf.getText();                                                //获取ip地址
                       
                        send(message.getBytes(),ip);                                                        //发送数据
                        String time = getCurrentTime();                                        //获取当前时间
                        String str = time + " 我对" + ip + "说:\r\n" + message + "\r\n\r\n";//alt + shift + l抽取局部变量
                        viewText.append(str);        //将信息添加到显示区域
                        bw.write(str);
                        sendText.setText("");                                                        //清空发送区域
                       
                }
               
                private String getCurrentTime() {
                        Date d = new Date();                                                        //创建时间对象
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//创建时间格式化对象
                        return sdf.format(d);                                                        //将时间对象格式化
                }

                private void centerPanel() {
                        Panel center = new Panel();                                                //创建中间的Panel
                        sendText = new TextArea(5,1);
                        viewText = new TextArea();
                        center.setLayout(new BorderLayout());                        //设置布局管理器
                        center.add(sendText,BorderLayout.SOUTH);                //将发送的文本区域添加到南边
                        center.add(viewText,BorderLayout.CENTER);                //将显示的文本区域添加到中间
                        viewText.setEditable(false);                                        //将显示的文本区域设置为不可以编辑
                        //viewText.setBackground(Color.WHITE);
                        viewText.setBackground(new Color(255,255,255));        //将显示的文本区域背景颜色设置为白色
                        sendText.setFont(new Font("仿宋", Font.PLAIN, 15));//将发送的文本区域的字体设置为15
                        viewText.setFont(new Font("仿宋", Font.PLAIN, 15));//将显示的文本区域的字体设置为15
                        this.add(center,BorderLayout.CENTER);                        //将Panel添加到Frame的中间
                }

                private void southPanel() {
                        Panel south = new Panel();                                                //创建南边的Panel
                        tf = new TextField(15);
                        tf.setText("192.168.12.51");
                        send = new Button("发 送");
                        clear = new Button("清 屏");
                        log = new Button("记 录");
                        shake = new Button("震 动");
                        south.add(tf);
                        south.add(send);
                        south.add(clear);
                        south.add(log);
                        south.add(shake);
                        this.add(south,BorderLayout.SOUTH);                                //将Panel添加到Frame的南边
                }

                private void init() {
                        this.setSize(400, 600);                                                        //设置窗体大小
                        this.setLocation(500, 50);                                                //设置窗体位置
                        this.setTitle("GUI聊天室");                                                //设置窗体标题
                        new Receive().start();
                        try {
                                socket = new DatagramSocket();
                                bw = new BufferedWriter(new FileWriter("config.txt",true));
                        } catch (Exception e) {
                               
                                e.printStackTrace();
                        }
                        this.setVisible(true);                                                        //设置窗体显示
                }
               
                private class Receive extends Thread {
                        public void run() {
                                try {
                                        DatagramSocket socket = new DatagramSocket(8888);        //创建socket
                                        DatagramPacket packet = new DatagramPacket(new byte[1024 * 8], 8192);//创建packet
                                        while(true) {
                                                socket.receive(packet);                                                        //接收
                                                String ip = packet.getAddress().getHostAddress();//获取ip地址
                                                byte[] arr = packet.getData();                                        //获取数据
                                                int len = packet.getLength();                                        //获取有效的字节个数
                                                if(arr[0] == -1 && len == 1) {                                        //如果发过来的是-1并且是一个字节
                                                        shake();                                                                        //震动
                                                        continue;                                                                        //终止本次循环继续下次循环
                                                }
                                                String time = getCurrentTime();                                        //获取当前时间
                                                String message = new String(arr,0,len);                        //将获取的有效字节个数转换为字符串
                                                String str = time + " " + ip + " 对我说:\r\n" + message + "\r\n\r\n";
                                                viewText.append(str);//添加到显示区域
                                                bw.write(str);
                                        }
                                } catch (Exception e) {
                                       
                                        e.printStackTrace();
                                }
                        }
                }
               
                public static void main(String[] args) {
                        new GUI_Chat();
                }

        }



点评

好厉害。  发表于 2014-11-11 02:44

6 个回复

倒序浏览
好长- -
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
好厉害。
回复 使用道具 举报
为啥都说java的gui很难看?只是觉得java的gui很难操作
回复 使用道具 举报

对  看晕了  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马