Java学习系列(十三)Java面向对象之界面编程

Java的界面编程

Java在客户端上表现并不突出,客户端往往都是局限在windows平台。AWT(JDK1.0发布,Sun希望在所有平台上都能运行),它并未为界面提供实现,直接调用的是操作系统上相应的界面组件,AWT只能使用各操作系统上界面组件的交集。Swing为绝大部分的界面组件提供了实现,这些组件都是直接回执在空白区域上,Swing自己实现了这些界面组件,因此Swing无需使用各操作系统上界面组件的交集,Swing的UI界面更加统一。

先看几个GUI工具类:
Component:一切【界面组件】的祖先。
MenuComponent:一切【菜单组件】的祖先。
Container(Window-顶级窗口/Panel-不能独立存在):它既可以是普通组件,也可以是存放组件的容器。
【注意】:Swing组件中除了JFrame、JDialog之外,都是轻量级组件。

在AWT里画图:创建Canvas或panel的子类,重写它的onPaint(Graphic g)
Graphic --相当于一个画笔,它们都是空白“矩形区域”。
JPanel,也是一个空白的“矩形区域”,它多了一个“双缓冲”机制。
双缓冲:当我们想往某个“组件”上绘制内容时,程序先在“内存”中绘制一张图片。
----这样就避免了在组件上一个一个地绘制,从而可提高性能。
ImageIO:专门用来做图片输出。UUID:生成随机字符串。

window可以独立存在,而Panel不能。

Java学习系列(十三)Java面向对象之界面编程

布局管理器:如果不使用布局管理器,而是直接通过x,y,width,height来控制组件的大小,存在弊端:a)当窗口大小改变时,界面变得非常难看;b)当改变运行平台时,界面无法自适应。而使用布局管理器后,我们无需显式控制组件的大小和外观,只要选择合适的布局管理器即可。

FlowLayout是Panel和Applet的默认管理器

Java代码 收藏代码
  1. publicclassFlowLayoutDemo{
  2. publicstaticvoidmain(String[]args){
  3. Frameframe=newFrame("FlowLayoutDemo");
  4. FlowLayoutlayout=newFlowLayout(FlowLayout.LEFT,20,30);
  5. frame.setBounds(80,80,100,200);
  6. frame.setLayout(layout);
  7. frame.add(newButton("确定"));
  8. frame.add(newButton("取消"));
  9. frame.setVisible(true);
  10. }
  11. }


BorderLayout将Container分为EAST、SOUTH、WEST、NORTH、CENTER五个区域,Component可以放置在这五个区域的一个位置,BorderLayout是Frame、Dialog的默认管理器。【注意】每个区域只能放一个组件。由于awt基本已经被淘汰,所以有关界面方面的知识点不会讲那么多。

JTable使用举例:

Java代码 收藏代码
  1. publicclassJTableDemo{
  2. publicstaticvoidmain(String[]args){
  3. JFramejf=newJFrame("MyTable");
  4. String[]titles=newString[]{"姓名","年龄","性别"};
  5. String[][]data=newString[][]{
  6. newString[]{"zhangsan","20","男"},
  7. newString[]{"lisi","21","男"},
  8. newString[]{"wangwu","23","女"},
  9. newString[]{"zhaoliu","22","女"},};
  10. JTabletable=newJTable(data,titles);
  11. jf.add(newJScrollPane(table));
  12. jf.pack();
  13. jf.setVisible(true);
  14. }
  15. }

JDialog使用实例:

Java代码 收藏代码
  1. publicclassJDialogDemo{
  2. JFramejf=newJFrame("My对话框");
  3. JButtonbt1=newJButton("打开mode对话框");
  4. JButtonbt2=newJButton("打开非mode对话框");
  5. JDialogjDialog1=newJDialog(jf,"模式对话框",true);
  6. JDialogjDialog2=newJDialog(jf,"非模式对话框",false);
  7. publicvoidinit(){
  8. jf.add(bt1);
  9. jf.add(bt2);
  10. jf.setLayout(newFlowLayout(FlowLayout.LEFT));
  11. bt1.addActionListener(newActionListener(){
  12. @Override
  13. publicvoidactionPerformed(ActionEventarg0){
  14. jDialog1.add(newButton("xxx"));
  15. jDialog1.show();
  16. }
  17. });
  18. bt2.addActionListener(newActionListener(){
  19. @Override
  20. publicvoidactionPerformed(ActionEventarg0){
  21. jDialog2.show();
  22. }
  23. });
  24. jf.pack();
  25. jf.setVisible(true);
  26. }
  27. publicstaticvoidmain(String[]args){
  28. newJDialogDemo().init();
  29. }
  30. }

JDialog读取文件内容:

Java代码 收藏代码
  1. publicclassJDialogDemo{
  2. JFramejf=newJFrame("对话框測試");
  3. JButtonbn=newJButton("打开文件");
  4. JFileChooserjfc=newJFileChooser("f:/");
  5. JTextAreajta=newJTextArea(10,80);
  6. publicvoidinit(){
  7. jf.add(newJScrollPane(jta));//放在中间
  8. JPaneljp=newJPanel();
  9. jp.add(bn);
  10. jp.setLayout(newFlowLayout());
  11. jf.add(jp,BorderLayout.SOUTH);
  12. bn.addActionListener(newActionListener(){
  13. @Override
  14. publicvoidactionPerformed(ActionEvente){
  15. jfc.showOpenDialog(bn);
  16. Filefile=jfc.getSelectedFile();
  17. BufferedReaderbr=null;
  18. try{
  19. jta.setText("");
  20. br=newBufferedReader(newInputStreamReader(
  21. newFileInputStream(file)));
  22. Stringline=null;
  23. while((line=br.readLine())!=null){
  24. jta.append(line+"\n\r");
  25. }
  26. }catch(IOExceptionex){
  27. ex.printStackTrace();
  28. }
  29. }
  30. });
  31. jf.pack();
  32. jf.setVisible(true);
  33. }
  34. publicstaticvoidmain(String[]args){
  35. newJDialogDemo().init();
  36. }
  37. }


事件编程:一个有UI的程序,无非就是new——>add....,而Java的事件处理模式,采用委托类的事件处理。

委托类的事件处理:a) 当事件源发生事件时,事件源不会对事件进行处理,他只是发出一个事件,事件会传给监听器,监听就【只能通过】事件对象来获取关于事件的详细信息,事件监听器都要实现一个【特定】的方法。【事件源】一切组件都可能是事件源。【事件】无需我们理会,类似的发出事件的过程也无需我们操心。【监听器】需要我们实现。监听器要实现相应的接口(规范)。不同事件,就会有相应的监听器,需要为事件源上不同类型的事件,注册(声明)相应的监听器。

实例说明:

Java代码 收藏代码
  1. publicclassActionListenerDemo{
  2. publicvoidinit(){
  3. JFramejf=newJFrame("事件监听实例");
  4. JButtonjbButton=newJButton("点击");
  5. jf.setLayout(newFlowLayout(FlowLayout.LEFT));
  6. jf.add(jbButton);
  7. jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  8. jf.setSize(300,200);
  9. jf.pack();
  10. jf.setVisible(true);
  11. jbButton.addActionListener(newMyActionListener());
  12. }
  13. classMyActionListenerimplementsActionListener{
  14. @Override
  15. publicvoidactionPerformed(ActionEvente){
  16. System.out.println("事件在"+e.getWhen()+"发生");
  17. }
  18. }
  19. publicstaticvoidmain(String[]args){
  20. newActionListenerDemo().init();
  21. }
  22. }

菜单:AWT的菜单中,MenuBar包含多个Menu,Menu包含多个MenuItem。而Swing的菜单要比AWT的菜单的功能更加强大,比如Swing菜单支持图标菜单。

ImageIO:

使用 ImageIO 类的静态方法可以执行许多常见的图像 I/O 操作。
此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage);有的用来控制图像读取过程(ImageReader、ImageReadParam 和 ImageTypeSpecifier)和控制图像写入过程(ImageWriter 和 ImageWriteParam);还有的用来执行格式之间的代码转换 (ImageTranscoder) 和报告错误 (IIOException)。

举例说明(生成随机验证码):

Java代码 收藏代码
  1. publicclassTest{
  2. publicstaticvoidmain(String[]args)throwsIOException{
  3. Randomrand=newRandom();
  4. //在內存中创建一张真彩色图片
  5. BufferedImageimage=newBufferedImage(150,25,
  6. BufferedImage.TYPE_4BYTE_ABGR);
  7. Graphics2Dg=(Graphics2D)image.getGraphics();//获取一支画笔
  8. g.setColor(Color.RED);
  9. g.setFont(newFont("ArialBlack",Font.ITALIC,16));
  10. StringBuffersb=newStringBuffer();
  11. for(inti=0;i<6;i++){
  12. charc=(char)(rand.nextInt(26)+65);
  13. sb.append(c);
  14. doubleangle=(rand.nextDouble()*(-Math.PI/6))+Math.PI/12;
  15. g.rotate(angle,i*24+18,25);//控制旋转,angle为旋转角度,后面两个参数用来指定旋转中心
  16. g.drawString(c+"",i*22+10,15);
  17. g.rotate(-angle,i*24+18,25);//再转回去
  18. }
  19. System.out.println(sb.toString());
  20. //生成的图片与src在同一目录
  21. ImageIO.write(image,"png",newFile(UUID.randomUUID()+".png"));
  22. }
  23. }

结束语:事件编程的重点就是实现事件处理器,重点就是实现事件的处理方法。有关Java中的界面编程就讲到这,内容很多,不可能面面俱到,而且JavaSE中的界面等学了Java web后基本不用,而且安卓的界面更有优势,所以JavaSE中的界面编程就将这些,了解一些常用的组件即可,不必死记。明天开始讲Java中的感觉非常有用的部分——线程。

你可能感兴趣的:(Java学习)