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的默认管理器

public class FlowLayoutDemo {public static void main(String[] args) {Frame frame = new Frame("FlowLayoutDemo");FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 20, 30);frame.setBounds(80, 80, 100, 200);frame.setLayout(layout);frame.add(new Button("确定"));frame.add(new Button("取消"));frame.setVisible(true);}
}

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

JTable使用举例:

public class JTableDemo {public static void main(String[] args) {JFrame jf = new JFrame("MyTable");String[] titles = new String[] { "姓名", "年龄", "性别" };String[][] data = new String[][] {new String[] { "zhangsan", "20", "男" },new String[] { "lisi", "21", "男" },new String[] { "wangwu", "23", "女" },new String[] { "zhaoliu", "22", "女" }, };JTable table = new JTable(data, titles);jf.add(new JScrollPane(table));jf.pack();jf.setVisible(true);}
}

JDialog使用实例:

public class JDialogDemo {JFrame jf = new JFrame("My对话框");JButton bt1 = new JButton("打开mode对话框");JButton bt2 = new JButton("打开非mode对话框");JDialog jDialog1 = new JDialog(jf, "模式对话框", true);JDialog jDialog2 = new JDialog(jf, "非模式对话框", false);public void init() {jf.add(bt1);jf.add(bt2);jf.setLayout(new FlowLayout(FlowLayout.LEFT));bt1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {jDialog1.add(new Button("xxx"));jDialog1.show();}});bt2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {jDialog2.show();}});jf.pack();jf.setVisible(true);}public static void main(String[] args) {new JDialogDemo().init();}
}

JDialog读取文件内容:

public class JDialogDemo {JFrame jf = new JFrame("对话框測試");JButton bn = new JButton(" 打开文件");JFileChooser jfc = new JFileChooser("f:/");JTextArea jta = new JTextArea(10, 80);public void init() {jf.add(new JScrollPane(jta));// 放在中间JPanel jp = new JPanel();jp.add(bn);jp.setLayout(new FlowLayout());jf.add(jp, BorderLayout.SOUTH);bn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {jfc.showOpenDialog(bn);File file = jfc.getSelectedFile();BufferedReader br = null;try {jta.setText("");br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));String line = null;while ((line = br.readLine()) != null) {jta.append(line + "\n\r");}} catch (IOException ex) {ex.printStackTrace();}}});jf.pack();jf.setVisible(true);}public static void main(String[] args) {new JDialogDemo().init();}
}

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

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

实例说明:

public class ActionListenerDemo {public void init() {JFrame jf = new JFrame("事件监听实例");JButton jbButton = new JButton("点击");jf.setLayout(new FlowLayout(FlowLayout.LEFT));jf.add(jbButton);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setSize(300, 200);jf.pack();jf.setVisible(true);jbButton.addActionListener(new MyActionListener());}class MyActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("事件在 " + e.getWhen() + "发生");}}public static void main(String[] args) {new ActionListenerDemo().init();}
}

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

ImageIO:

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

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

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

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

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

  1. Java学习系列(十)Java面向对象之I/O流(上)

    IO流 我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存.面向IO流编程就是一种很好的选择.IO:I ...

  2. Java学习系列(十一)Java面向对象之I/O流(下)

    今天接着昨天的IO流讲,内容可能会比较多. DataInputStream与DataOutputStream 它们是建立在已有的IO的基础上的两个特殊的过滤流.规律:它们只是增加了一些特定的方法读取特 ...

  3. Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解

    今天内容比较多,直接步入正题吧. 类和对象的定义 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起.而对象是具有类类型的变量,存在于堆内存中.类是对象的抽象,而对 ...

  4. Java学习系列(十七)Java面向对象之开发聊天工具

    TCP通信: Socket --相当于"虚拟链路两端的插座".Socket负责完成通信. ServerSocket --它只负责"接收"连接.它用于产生Sock ...

  5. Java学习系列及数据结构博客全目录

    Java学习系列 Java学习系列(一)Java的运行机制.JDK的安装配置及常用命令详解 Java学习系列(二)Java注释.标识符.基本数据类型及其转换易错点详解 Java学习系列(三)Java运 ...

  6. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  7. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  8. Java学习系列(十二)Java面向对象之序列化机制及版本

    序列化:内存中的Java对象<-->二进制流 目的:a)有时候需要把对象存储到外部存储器中持久化保存,b)还有时候,需要把对象通过网络传输. 可序列化的对象,Java要求可序列化的类实现下 ...

  9. Java学习07:Java面向对象

    Java学习07: Java面向对象: 链接:https://pan.baidu.com/s/1gzlBk5OOVI6oEv-WOkHuhQ  提取码:iqov

最新文章

  1. 3.7Python数据处理篇之Numpy系列(七)---Numpy的统计函数
  2. linux c一站式编程 pdf,《Linux·C编程一站式学习》·(宋劲杉)·文字版.pdf
  3. ABAP SUBMIT 程序时带屏幕默认值
  4. zuul路由前缀配置
  5. Can not load “libqxcb.so”
  6. 正交变换在基下的矩阵都是可逆阵_矩阵分析与应用(一,矩阵基础知识)
  7. git-工作区与暂存区
  8. 姆巴佩独造三球一战成名 阿里云打破世界杯流量纪录 1
  9. 疑似BAT的BUG及避错办法
  10. VBS表白代码以及一些注意事项
  11. 股权-公司治理的至高点,如何合理运用股权(融人、融资、融市场) 张明若
  12. SDN学习继续(二)
  13. 抖音无人直播技术手机版,增加多平台实时在线转播功能,无人直播防屏蔽防检测
  14. 内置函数2 递归函数
  15. .net读取Excel批注
  16. 计算机专业b区大学,b区考研学校,b区考研学校排名。
  17. 原理分析:安卓手机桌面长按分享,安卓发送软件apk,qq发送软件apk 原理
  18. 小试牛刀—猜数字游戏
  19. mysql 人员查询总结
  20. 零基础入门NPL之新闻分类

热门文章

  1. nbu WIN平台下面(mtx/robtest/tar/nt_ttu)手动测试driver是否正常
  2. Django如何让未登录的用户自动跳转至登录页
  3. CSS控制div宽度最大宽度/高度和最小宽度/高度
  4. ASP.NET中的HTTP模块和处理程序
  5. 如何在Windows下搭建Android开发环境
  6. C语言中一个指针传递问题的分析
  7. 使用C#在应用程序间发送消息
  8. cisco查看模块是单模多模
  9. Pi3 中文环境以及输入法
  10. ArcGIS for Android 中实现要素绘制时固定MapView