浏览 5252 次
锁定老帖子 主题:练手java GUI(一)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-28
最后修改:2010-11-29
java swing 已经基本上忘的差不多了,没事的时候开始练手了。希望走过路过的大虾不吝赐教,多多指点~~~谢先.. 下面做的是一个一对一聊天的小程序:
第一步:设计视图;
package j2se.gui; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.Label; import java.awt.List; import java.awt.Panel; import java.awt.TextField; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MainFrame extends Frame { private List list; private Panel panel; private Panel ipPanel; private Panel dataPanel; private TextField txtIP; private TextField txtData; private WindowClosingDispose windowClosingDispose; private Label labelIP; private Label labelData; public MainFrame() { setData(); setShow(); setFrame(); setListener(); } private void setData() { list = new List(10); panel = new Panel(); ipPanel = new Panel(); dataPanel = new Panel(); labelIP = new Label("对方IP:"); labelData = new Label("您要说:"); txtIP = new TextField(20); txtIP.setText("127.0.0.1"); txtData = new TextField(50); } private void setShow() { this.add(list,BorderLayout.CENTER); this.add(panel,BorderLayout.SOUTH); panel.setLayout(new BorderLayout()); ipPanel.setLayout(new BorderLayout()); dataPanel.setLayout(new BorderLayout()); ipPanel.add(labelIP,BorderLayout.WEST); ipPanel.add(txtIP,BorderLayout.EAST); dataPanel.add(labelData,BorderLayout.WEST); dataPanel.add(txtData,BorderLayout.EAST); panel.add(ipPanel,BorderLayout.WEST); panel.add(dataPanel,BorderLayout.EAST); windowClosingDispose = this.new WindowClosingDispose(); } private void setFrame() { this.setBounds(200, 100, 700, 500); this.setTitle("Chat"); this.setVisible(true); } private void setListener() { this.addWindowListener(windowClosingDispose); } private class WindowClosingDispose extends WindowAdapter{ @Override public void windowClosing(WindowEvent arg0) { super.windowClosing(arg0); MainFrame.this.dispose(); System.exit(0); } } public List getList() { return list; } public TextField getTxtIP() { return txtIP; } public TextField getTxtData() { return txtData; } }
第二步:设计socket逻辑,本例中使用UDP协议:
package j2se.gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class MessageTransform { private MainFrame mainFrame; private DatagramSocket dsSender; private Thread receierThread; private DatagramSocket dsReceiver; private int PortReceiver = 3000; private int bufLengthReceiver = 1024; public MessageTransform(MainFrame mainFrame) { this.mainFrame = mainFrame; initData(); initSender(); initReceiver(); } private void initData() { try { dsSender = new DatagramSocket(); dsReceiver = new DatagramSocket(PortReceiver); } catch (SocketException e) { e.printStackTrace(); } } private void initSender() { mainFrame.getTxtData().addActionListener(this.new SenderAction()); } private void initReceiver() { receierThread = new Thread(this.new ReceiverAction()); receierThread.start(); } private class SenderAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String sendData = mainFrame.getTxtData().getText(); if (sendData.isEmpty() || sendData.length() <= 0) { return; } mainFrame.getList().add("您说: "+sendData,0); byte[] buf = sendData.getBytes(); try { DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(mainFrame.getTxtIP().getText()), PortReceiver); dsSender.send(dp); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } mainFrame.getTxtData().setText(""); } } private class ReceiverAction implements Runnable { @Override public void run() { byte[] buf = new byte[bufLengthReceiver]; DatagramPacket dp = new DatagramPacket(buf, bufLengthReceiver); while (true) { try { dsReceiver.receive(dp); mainFrame.getList().add(new String(buf,0,dp.getLength())+" from:" + dp.getAddress().getHostAddress()+":"+dp.getPort(), 0); } catch (IOException e) { e.printStackTrace(); } } } } }
第三部:程序入口: package j2se.gui; public class Chat { private MainFrame mainFrame; private MessageTransform messageTransform; public Chat() { mainFrame = new MainFrame(); messageTransform = new MessageTransform(mainFrame); } public static void main(String[] args) { new Chat(); } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-11-29
上面的程序在有些机器上跑,显示出的是乱码,想知道应该怎么改??
|
|
返回顶楼 | |
发表时间:2010-11-29
把中文全部写在properties里用unicode编码保存。。。要不然到Linux下还是乱码。。
|
|
返回顶楼 | |
发表时间:2010-11-30
zgzdzh 写道 把中文全部写在properties里用unicode编码保存。。。要不然到Linux下还是乱码。。
十分感谢,回头试试。。 |
|
返回顶楼 | |
发表时间:2010-12-02
能在局域网通信吗?
|
|
返回顶楼 | |
发表时间:2010-12-02
sam_kee 写道 能在局域网通信吗?
可以~~ |
|
返回顶楼 | |
发表时间:2010-12-02
qianhd 写道 玩具
哈哈,过奖了,要是我自己评价,就是连玩具都不如,玩具最起码还是有一定的利用价值~~~ |
|
返回顶楼 | |