Java图形化界面编程——Swing编程

本文详细介绍了Java Swing编程,包括Swing组件层次、AWT组件的Swing实现、组件边框设置、JToolBar创建工具条、JColorChooser和JFileChooser的使用,以及JOptionPane的基本操作。Swing提供了丰富的组件和一致的跨平台外观,允许开发者创建功能强大的图形用户界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 Swing概述

2 Swing基本组件的用法

2.1 Swing组件层次

2.2 AWT组件的Swing实现

2.3 为组件设置边框

2.4 使用JToolBar创建工具条

2.5 JColorChooser和JFileChooser

JColorChooser

JFileChooser

2.6 JOptionPane

基本概述

消息对话框:

确认对话框:

输入对话框:

选项对话框:

Swing概述

        Swing是完完全全由Java实现的,不再依赖本地平台的GUI,因此可以在所有平台上都保持相同的界面外观,独立于本地平台的Swing组件被称为轻量级组件;而依赖于本地平台的AWT组件被称为重量级组件

        由于Swing的所有组件完全采用Java实现,不再调用本地平台的GUI,所有导致Swing图形界面的显示速度要比AWT图形界面的显示速度慢一些,但相对于快速发展的硬件设施而言,这种微小的速度差距并无大碍。

使用Swing的优势:

        1.Swing组件不再依赖于本地平台的GUI,无需采用各种平台的GUI交集,因此Swing提供了大量图形界面组件,远超出了AWT提供的图形界面组件集;

        2.Swing组件不再依赖于本地平台GUI,因此不会产生与平台相关的bug;

        3.Swing组件在各个平台上运行时可以保证相同的图形界面外观。

Swing的特征:

        1.Swing组件采用MVC(Model-View-Controller,即模型-视图-控制器)设计模式:

        模型(Model):用于维护组建的各种状态;

        视图(View):是组件的可视化表现;

        控制器(Controller):用于控制对于各种事务、组件做出响应。

        当模型发生改变时,他会通知所有依赖它的视图,视图会根据模型数据来更新自己。Swing使用UI代理来包装视图和控制器,还有一个模型对象来维护该组件的状态。

        例如,按钮JButton有一个维护其状态信息的模型ButtonModel对象。Swing组件的模型是自动设置的,因此一般都使用JButton,而无需关心ButtonModel对象。

        2.Swing在不同平台上表现一致,并且有能力提供本地平台不支持的显示外观。由于Swing采用MVC模式来维护各组件,所以当组件的外观被改变时,对组件的状态信息没有影响。音系,Swing可以使用插拔式外观感觉(Pluggable Look And Feel  :  PLAF) 来控制组件外观,使得Swing图形界面在同一个平台上运行时能拥有不同的外观,用户可以选择自己喜欢的外观。相比之下,AWT图形界面中,由于控制组件外观的对等类与具体平台相关,因此AWT组件总是具有与本地平台相关的外观。

2 Swing基本组件的用法

2.1 Swing组件层次

        大部分Swing组件都是JComponent抽象类的直接或间接子类(并不是全部的Swing组件),JComponent类定义了所有子类组建的通用方式,JComponent类是AWT里java.awt.Container类的子类,这也是AWT和Swing的联系之一。绝大部分Swing组件类继承了Container类,所以Swing组件都可作为容器使用(JFrame继承了Frame类)。

Swing组件和AWT组件的对应关系:

        大部分情况下,只需要在AWT组件的名字前面加一个J,就可以得到其对应的Swing组件名称,但有几个例外:

        1.JcomboBox:对应AWT里的Choice组件,但比Choice组件丰富;

        2.JFileChooser:对应AWT里的FileDialog组件;

        3.JScrollBar:对应于AWT里的Scrollbar组件,注意两个组件类名中b字母的大小写;

        4.JCheckBox:对应于AWT里的Checkbox组件,大小写区别;

        5.JCheckBoxMenuItem:对应AWT里的CheckboxMenuItem组件,大小写。

Swing组件按照功能分类:

        1.顶层容器:JFrame,JApplet,JDialog和JWindow。

        2.中间容器:JPanel,JScrollPane,JSplitPane,JToolBar等。

        3.特殊容器:在用户界面上 具有特殊作用的中间容器,如JIntemalFrame,JRootPane,JLayeredPane和JDestopPane等。

        4.基本组件:实现人机交互的组件,如JButton,JComboBox,JList,JMenu,JSlider等。

        5.不可编辑信息的显示组件:向用户显示能够编辑的格式化信息的组件,如JTable,JTextArea和JTextField等。

        6.特殊对话框组件:可以直接产生特殊对话框的组件,如JColorChooser和JFileChooser等。

2.2 AWT组件的Swing实现

        Swing为除Canvas之外的所有AWT组件提供了相应的实现,Swing组件比AWT组件的功能更加强大。相对于AWT组件,Swing组件具有如下4个额外的功能:

        1.可以为Swing组件设置提示信息。使用setToolTipText()方法,为组件设置对用户有帮助的提示信息。

        2.很多Swing组件如按钮、标签、菜单项等,除使用文字外,还可以使用图标修饰自己。为了允许在Swing组件中使用图标,Swing为Icon接口提供了一个实现类:ImageIcon,该实现类代表一个图像图标。

        3.支持插拔式的外观风格。每个JComponent对象都有一个相应的ComponentUI对象,为它完成所有的绘画、事件处理、决定尺寸大小等工作。ComponentUI对象依赖当前使用的PLAF,使用UIManager.setLookAndFeel()方法可以改变图形界面的外观风格。

        4.支持设置边框。Swing组件可以设置一个或多个边框。Swing中提供了各式各样的边框供用户使用,也能建立组合边框或自己设计边框。一种空白边框可以用于增大组件,同时协调布局管理器中的组件进行合理的布局。

        每个Swing组件都有一个对应的UI类,例如JButton组件就有一个对应的ButtonUI类来作为UI代理。每个Swing组建的UI代理的类名总是将该Swing组件类名的J去掉,然后在后面添加UI后缀。UI代理类通常是一个抽象基类,不同的PLAF会有不同的UI代理实现类。Swing类库中包含了几套UI代理,分别放在不同的包下,每套UI代理都几乎包含了所有Swing组件的ComponentUI实现,每套这样的实现都被称为一种PLAF实现。

        如果需要改变程序的外观风格,可以使用如下代码:


   
   
  1. / /容器
  2. JFrame jf =new JFrame();
  3. try{
  4. / /设置外观风格
  5. UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windowsLookAndFeel");
  6. / /刷新jf容器及其内部组件的外观
  7. SwingUtilities.updateComponentTreeUI(jf);
  8. }catch( Exception e){
  9. e.printStackTrace();
  10. }

案例:

        下面使用Swing组件完成下图效果:


   
   
  1. public class SwingComponentDemo {
  2. JFrame f = new JFrame( "测试Swing基本组件");
  3. //声明菜单相关的组件
  4. JMenuBar menuBar = new JMenuBar();
  5. JMenu fileMenue = new JMenu( "文件");
  6. JMenu editMenue = new JMenu( "编辑");
  7. JMenuItem auto = new JMenuItem( "自动换行");
  8. JMenuItem copy = new JMenuItem( "复制", new ImageIcon( "swing\\img\\component\\copy.png"));
  9. JMenuItem paste = new JMenuItem( "粘贴", new ImageIcon( "swing\\img\\component\\paste.png"));
  10. JMenu formatMenu = new JMenu( "格式");
  11. JMenuItem comment = new JMenuItem( "注释");
  12. JMenuItem cancelComment = new JMenuItem( "取消注释");
  13. //声明文本域
  14. JTextArea ta = new JTextArea( 8, 20);
  15. String[] colors= { "红色", "绿色", "蓝色"};
  16. //声明列表框
  17. JList<String> colorList = new JList<String>(colors);
  18. //声明选择相关组件
  19. JComboBox<String> colorSelect = new JComboBox<String>();
  20. ButtonGroup bg = new ButtonGroup(); //按钮组,实现单选效果
  21. JRadioButton male = new JRadioButton( "男", false);
  22. JRadioButton female = new JRadioButton( "女", true);
  23. JCheckBox isMarried = new JCheckBox( "是否已婚?", true);
  24. //声明底部
  25. JTextField tf = new JTextField( 40);
  26. JButton ok = new JButton( "确定", new ImageIcon( "swing\\img\\component\\ok.png"));
  27. //声明右键菜单
  28. JPopupMenu jPopupMenu = new JPopupMenu();
  29. ButtonGroup poupButtonBg = new ButtonGroup();
  30. JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem( "Metal 风格");
  31. JRadioButtonMenuItem nimbusItem = new JRadioButtonMenuItem( "Nimbus 风格");
  32. JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem( "Windows 风格", true);
  33. JRadioButtonMenuItem windowsClassicItem = new JRadioButtonMenuItem( "Windows 经典风格");
  34. JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem( "Motif 风格");
  35. //初始化界面
  36. public void init () {
  37. //组装视图
  38. //组装底部
  39. JPanel bottomPanel = new JPanel();
  40. bottomPanel.add(tf);
  41. bottomPanel.add(ok);
  42. f.add(bottomPanel, BorderLayout.SOUTH);
  43. //组装选择相关的组件
  44. JPanel selectPanel = new JPanel();
  45. colorSelect.addItem( "红色");
  46. colorSelect.addItem( "绿色");
  47. colorSelect.addItem( "蓝色");
  48. selectPanel.add(colorSelect);
  49. bg.add(male);
  50. bg.add(female);
  51. selectPanel.add(male);
  52. selectPanel.add(female);
  53. selectPanel.add(isMarried);
  54. //组装文本域和选择相关组件
  55. Box topLeft = Box.createVerticalBox();
  56. topLeft.add(ta);
  57. topLeft.add(selectPanel);
  58. //组装顶部
  59. Box top = Box.createHorizontalBox();
  60. top.add(topLeft);
  61. top.add(colorList);
  62. f.add(top);
  63. //组装顶部菜单
  64. formatMenu.add(comment);
  65. formatMenu.add(cancelComment);
  66. editMenue.add(auto);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值