------- android培训、java培训、期待与您交流! ----------
GUI与网络编程
GUI
Graphical User Interface图形用户接口,即用图像化的形式来显示用户的操作端口,相比较命令行用户接口而言更加方便与直观。
GUI提供的对象都存java.Awt和javax.Swing两个包中:
java.Awt:AbstractWindow ToolKit ,抽象窗口工具包,重量级控件,调用本地系统方法实现功能。
javax.Swing:轻量级控件在AWT的基础上建立的一套图形界面系统,其中提供了更多的组件。
GUI内部对象的关系图如下:
Container作为容器,可以通过内部方法add添加其他组件以完成GUI的涉及
布局,即容器中的组件的排放方式。
1. 最常用的是流式布局管理器,FlowLayout,即从左到右按顺序进行组件的排列,是Panel默认的布局管理器。
2. 边界布局管理器,BorderLayout,通过把组件分别设置在东,南,西,北,中完成布局,是Frame默认的布局管理器。
3. 网格布局管理器,GridLayout,按有规则的矩阵进行布局。
4. 卡片布局管理器,CardLayout,按照选项卡一样布局。
5. 网格包布局管理器,GridBagLayout,即无规则的矩阵的布局方式。
Eg: newframe().setLayout(new FlowLayout());
newframe().setLayout(new CardLayout ());
Eg:
public static voidmain(String[] args)
{
JFrame f = new JFrame(); //创建frame窗体。
f.setBounds(300,100,500,400); //设置大小
f.setLayout(new FlowLayout());//设置布局
JButton but = new JButton("按钮");//定义组件
f.add(but); //添加到窗体
f.addWindowListener(new WindowAdapter()
{
public voidwindowClosing(WindowEvent e)
{
System.exit(0);
}
});//添加事件监听响应机制,这里是窗口关闭响应
f.setVisible(true);// 让窗体显示
}
事件监听机制
事件监听机制:当有外部,包括鼠标,键盘,文件等对事件源,即各种处于containner上面的组件进行操作时,监听器会发生响应并产生事件对象交给事件处理方式产生响应的事件。
组成元素:
事件源:各种图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:通过添加addaddXXXListener()方法对事件源进行监听
事件处理处理方式
Eg:
public static void main(String[] args)
{
Frame f = newFrame("窗体");//设置窗体
f.setSize(400,300);//设置大小
f.setLocation(500,300);//设置位置,距离左侧500,距离上面300
f.setLayout(new FlowLayout());//设置流式布局
Button b = newButton("按钮");//定义按钮
Button b2 = newButton("按钮2");
TextField tf = newTextField(20);//定义输入框
f.add(b);//按顺序添加按钮
f.add(b2);
f.add(tf);//添加输入框
b.addActionListener(newActionListener()
{//通过匿名内部类添加动作监听器
public void actionPerformed(ActionEvent e)
{
System.out.println("按钮把界面关闭了");
}
}
b.addMouseListener(newMouseAdapter()//鼠标动作监听器
{
int count = 1;
public voidmouseEntered(MouseEvent e)
{
System.out.println("鼠标进入"+(count++)+"次!");
}
});
b.addMouseListener(newMouseAdapter()
{
int clickCount = 1;
public voidmouseClicked(MouseEvent e)
{
if(e.getClickCount()== 2)
{
System.out.println("双击动作"+clickCount++);
}
}
});
b2.addKeyListener(newKeyAdapter()
{
public void keyPressed(KeyEvent e)
{
System.out.println("键盘的作用");
System.out.println(e.getKeyChar()+"---"+e.getKeyCode());
if(e.getKeyCode() == 27)
{//按住esc键退出
System.out.println("ESC键把我关闭了!");
System.exit(0);
}
//组合键去关闭 CTRL + ENTER
if(e.isControlDown()&& e.getKeyCode() == KeyEvent.VK_ENTER)
{
System.out.println("CTRL+ ENTER组合键关闭");
System.exit(0);
}
}
});
tf.addKeyListener(new KeyAdapter()
{
public voidkeyPressed(KeyEvent e)
{
if(!(e.getKeyCode()>=KeyEvent.VK_0 &&e.getKeyCode()<=KeyEvent.VK_9))
{
System.out.println(e.getKeyChar()+"不是数字");
}
}
});
f.setVisible(true);//设置可见性
}
Dialog
跳出具有可选是否依附于窗体的对话框,假如true的话对话框依附于窗体,不取消Dialog不可以操作窗体;false的话,不取消Dialog依旧可以操作窗体。
Eg:
菜单
提供可供选择的选项。
父类:MenuComponent
子类:MenuBar和MenuItem(有子类Menu)
通过setMenuBar()方法,将菜单添加到Frame中。
Eg:
class MenuDemo
{//声明全局可调用的对象
private Frame f;
private MenuBar mb;
private Menu m,subm;
private MenuItem mi,close,save,open;
private FileDialog openDia,saveDia;
private TextArea ta;
private File file;
MenuDemo()
{
f = new Frame("我的电脑");
f.setBounds(400, 150, 500, 500);
mb = new MenuBar();
m = new Menu("文件");
save = new MenuItem("保存");
open = new MenuItem("打开");
subm = new Menu("子菜单");
close = new MenuItem("退出");
mi = new MenuItem("子菜单2");
openDia = new FileDialog(f, "打开", FileDialog.LOAD);//加载
saveDia = new FileDialog(f, "保存", FileDialog.SAVE);//保存
ta = new TextArea();
f.setMenuBar(mb);//添加MenuBar
mb.add(m);//在MenuBar中添加menu
subm.add(mi);//在子菜单中添加子菜单2
m.add(subm);//在meun中添加子菜单
m.add(open);
m.add(save);
m.add(close);
f.add(ta);
f.setVisible(true);
ini();//设置完GUI表面后设置GUI内部
}
public void ini()
{
open.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{//匿名内部类添加动作监听器
openDia.setVisible(true); //弹出对话框以打开文件
String path = openDia.getDirectory();//获取路径
String name = openDia.getFile();//获取文件名
if(path==null || name==null)
return ;
ta.setText("");//每次开始都对文本框进行清空
file = new File(path, name); //文件初始化
try
{
BufferedReader br = new BufferedReader(newFileReader(file)) String line = null;
while((line = br.readLine()) != null)
{
ta.append(line+"\n");//换行
}
br.close();//关闭资源
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
});
save.addActionListener(new ActionListener()//弹出保存文件对话框
{
public void actionPerformed(ActionEvent e)
{
if(file == null)
{
saveDia.setVisible(true);//文件不存在才弹出以创建文件
String path = saveDia.getDirectory();
String name = saveDia.getFile();
if(name == null || path == null)
return;
file = new File(path,name);
}
try {
BufferedWriter bw = new BufferedWriter(newFileWriter(file));
String s = ta.getText();
bw.write(s);
bw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
//窗口关闭监听器
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//退出菜单响应监听器
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
}
public class MenuDemo
{
public static void main(String[] args)
{
new MyMenuDemo();
}
}
注意:
1, GUI的组件的排序与在Java编码的时候的排序有关;
2, GUI的编程与IO编程等一样,有编码顺序与编码思想。
网络编程
即网络间设备的数据交换。在具备网络编程交换要素的情况下,数据交换逻辑上成立。
网络编程要素:
IP地址:每一个在网络中设备锁被分配的标识,没必要记忆,一般被翻译为网址,在本机中具有的回环地址为127.0.0.1 ,即localhost。
端口号:是不同进程的标识的逻辑地址,从0到65535,其中0~1024为系统使用或保留的端口,不可用;可用的是1025到65535.
传输协议:设备间通讯的协议,常见的协议有TCP,UDP。
TCP
Transmission control protocol 传输控制协议:通过对网络中交流的设备中传输的流进行控制以达到传输的可靠性,保证了传输内容的有序性与完整性,但是牺牲了速度。比较复杂的网络结构,一般多用于对数据的准确度要求比较高的数据交流。
UDP
Unit datagram protocol :通过把数据打包后丢出数据包进去网络中进行数据的输出,不关注数据包的走向与用时,所以数据到达的顺序可能无序,时间不定,网络结构要求简单。一般用于对数据要求准确度不高的数据交流。
Socket
为网络服务提供的一种机制,每个交换数据的网络设备都配有的Socket,作为端口用于数据的输入与输出,数据在两个Socket间通过IO传输。
UDP传输流程
public static voidmain(String[] args)throws Exception
{
DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。
String text = "udp传输演示"; // 明确要发送的具体数据。
byte[] buf = text.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);// 将数据封装成了数据包
ds.send(dp); // 用socket服务的send方法将数据包发送出去。
ds.close();// 关闭资源。
}
TCP传输流程
tcp的两个端点:一个是客户端,对应的对象为Socket,一个是服务端,对应的对象为ServerSocket。
在客户端发出数据:
public static voidmain(String[] args) throws Exception
{
Socket s = new Socket("127.0.0.1",21114);
OutputStream out = s.getOutputStream();//获取输出流对象。
out.write("tcp演示".getBytes());//明确输出数据
s.close();//关闭资源
}
在服务端接受数据:
public static voidmain(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10002);//建立服务端的socket服务
Socket s = ss.accept();//获取客户端对象
String ip =s.getInetAddress().getHostAddress();
InputStream in = s.getInputStream();//使用socket读取客户端的数据,
byte[] buf = new byte[1024];//缓冲器
int len = in.read(buf);//读取数据
String txt = new String(buf,0,len);
System.out.println(txt);//输出数据到consolo
s.close();//先关客户端
ss.close();//后关服务端
}
双向通话:
public class Demo
{
public static voidmain(String[] args) throws Exception
{
Socket s = newSocket("localhost",10128);
OutputStream out =s.getOutputStream();
out.write("test,test".getBytes());
s.shutdownOutput();//关闭标签
InputStream is =s.getInputStream();
byte []buf = newbyte[1024];
int len =is.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
服务器端
public class Demo
{
public static void main(String[] args) throws Exception {
ServerSocket ss = newServerSocket(10128);
Socket s =ss.accept();
String ip =s.getInetAddress().getHostAddress();
InputStream in =s.getInputStream();
byte[] buf = newbyte[1024];
int len;
while((len =in.read(buf)) != -1)
{
System.out.println(new String(buf,0,len));
}
OutputStream os =s.getOutputStream();
os.write("well done".getBytes());
s.close();
ss.close();
}
}
注意:
理解编码过程,熟练编码顺序,灵活运用即可。
PrintWriter用println加上true以自动刷新。