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不能。

 

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

FlowLayout是Panel和Applet的默认管理器

 

Java代码   收藏代码
  1. public class FlowLayoutDemo {  
  2.     public static void main(String[] args) {  
  3.         Frame frame = new Frame("FlowLayoutDemo");  
  4.         FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 2030);  
  5.         frame.setBounds(8080100200);  
  6.         frame.setLayout(layout);  
  7.         frame.add(new Button("确定"));  
  8.         frame.add(new Button("取消"));  
  9.         frame.setVisible(true);  
  10.     }  
  11. }  


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

 

JTable使用举例:

 

Java代码   收藏代码
  1. public class JTableDemo {  
  2.     public static void main(String[] args) {  
  3.         JFrame jf = new JFrame("MyTable");  
  4.         String[] titles = new String[] { "姓名""年龄""性别" };  
  5.         String[][] data = new String[][] {  
  6.                 new String[] { "zhangsan""20""男" },  
  7.                 new String[] { "lisi""21""男" },  
  8.                 new String[] { "wangwu""23""女" },  
  9.                 new String[] { "zhaoliu""22""女" }, };  
  10.         JTable table = new JTable(data, titles);  
  11.         jf.add(new JScrollPane(table));  
  12.         jf.pack();  
  13.         jf.setVisible(true);  
  14.     }  
  15. }  

JDialog使用实例:

 

 

Java代码   收藏代码
  1. public class JDialogDemo {  
  2.     JFrame jf = new JFrame("My对话框");  
  3.     JButton bt1 = new JButton("打开mode对话框");  
  4.     JButton bt2 = new JButton("打开非mode对话框");  
  5.     JDialog jDialog1 = new JDialog(jf, "模式对话框"true);  
  6.     JDialog jDialog2 = new JDialog(jf, "非模式对话框"false);  
  7.   
  8.     public void init() {  
  9.         jf.add(bt1);  
  10.         jf.add(bt2);  
  11.         jf.setLayout(new FlowLayout(FlowLayout.LEFT));  
  12.         bt1.addActionListener(new ActionListener() {  
  13.             @Override  
  14.             public void actionPerformed(ActionEvent arg0) {  
  15.                 jDialog1.add(new Button("xxx"));  
  16.                 jDialog1.show();  
  17.             }  
  18.         });  
  19.         bt2.addActionListener(new ActionListener() {  
  20.             @Override  
  21.             public void actionPerformed(ActionEvent arg0) {  
  22.                 jDialog2.show();  
  23.             }  
  24.         });  
  25.         jf.pack();  
  26.         jf.setVisible(true);  
  27.     }  
  28.   
  29.     public static void main(String[] args) {  
  30.         new JDialogDemo().init();  
  31.     }  
  32. }  

 

 

JDialog读取文件内容:

 

Java代码   收藏代码
  1. public class JDialogDemo {  
  2.     JFrame jf = new JFrame("对话框測試");  
  3.     JButton bn = new JButton(" 打开文件");  
  4.     JFileChooser jfc = new JFileChooser("f:/");  
  5.     JTextArea jta = new JTextArea(1080);  
  6.   
  7.     public void init() {  
  8.         jf.add(new JScrollPane(jta));// 放在中间  
  9.         JPanel jp = new JPanel();  
  10.         jp.add(bn);  
  11.         jp.setLayout(new FlowLayout());  
  12.         jf.add(jp, BorderLayout.SOUTH);  
  13.         bn.addActionListener(new ActionListener() {  
  14.             @Override  
  15.             public void actionPerformed(ActionEvent e) {  
  16.                 jfc.showOpenDialog(bn);  
  17.                 File file = jfc.getSelectedFile();  
  18.                 BufferedReader br = null;  
  19.                 try {  
  20.                     jta.setText("");  
  21.                     br = new BufferedReader(new InputStreamReader(  
  22.                             new FileInputStream(file)));  
  23.                     String line = null;  
  24.                     while ((line = br.readLine()) != null) {  
  25.                         jta.append(line + "\n\r");  
  26.                     }  
  27.                 } catch (IOException ex) {  
  28.                     ex.printStackTrace();  
  29.                 }  
  30.   
  31.             }  
  32.         });  
  33.         jf.pack();  
  34.         jf.setVisible(true);  
  35.     }  
  36.   
  37.     public static void main(String[] args) {  
  38.         new JDialogDemo().init();  
  39.     }  
  40. }  


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

 

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

实例说明:

 

Java代码   收藏代码
  1. public class ActionListenerDemo {  
  2.     public void init() {  
  3.         JFrame jf = new JFrame("事件监听实例");  
  4.         JButton jbButton = new JButton("点击");  
  5.         jf.setLayout(new FlowLayout(FlowLayout.LEFT));  
  6.         jf.add(jbButton);  
  7.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  8.         jf.setSize(300200);  
  9.         jf.pack();  
  10.         jf.setVisible(true);  
  11.         jbButton.addActionListener(new MyActionListener());  
  12.     }  
  13.   
  14.     class MyActionListener implements ActionListener {  
  15.         @Override  
  16.         public void actionPerformed(ActionEvent e) {  
  17.             System.out.println("事件在 " + e.getWhen() + "发生");  
  18.         }  
  19.     }  
  20.   
  21.     public static void main(String[] args) {  
  22.         new ActionListenerDemo().init();  
  23.     }  
  24. }  

 

 

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

ImageIO:

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

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

Java代码   收藏代码
  1. public class Test {  
  2.     public static void main(String[] args) throws IOException {  
  3.         Random rand = new Random();  
  4.         // 在內存中创建一张真彩色图片  
  5.         BufferedImage image = new BufferedImage(15025,  
  6.                 BufferedImage.TYPE_4BYTE_ABGR);  
  7.         Graphics2D g = (Graphics2D) image.getGraphics();// 获取一支画笔  
  8.         g.setColor(Color.RED);  
  9.         g.setFont(new Font("Arial Black", Font.ITALIC, 16));  
  10.         StringBuffer sb = new StringBuffer();  
  11.         for (int i = 0; i < 6; i++) {  
  12.             char c = (char) (rand.nextInt(26) + 65);  
  13.             sb.append(c);  
  14.             double angle = (rand.nextDouble() * (-Math.PI / 6)) + Math.PI / 12;  
  15.             g.rotate(angle, i * 24 + 1825);// 控制旋转,angle为旋转角度,后面两个参数用来指定旋转中心  
  16.             g.drawString(c + "", i * 22 + 1015);  
  17.             g.rotate(-angle, i * 24 + 1825);// 再转回去  
  18.         }  
  19.         System.out.println(sb.toString());  
  20.         // 生成的图片与src在同一目录  
  21.         ImageIO.write(image, "png"new File(UUID.randomUUID() + ".png"));  
  22.     }  
  23. }  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值