Java Swing学习

内容来源于《java语言程序设计》(郎波著)以及一些个人理解。


一、JFC 简介

JFC(Java Foundation Classes,Java基础类库)是Java平台的一个重要组成部分。JFC包括了开发GUI(Graphics User Interface,图形化用户界面)所需的组件和服务,它包括5个部分的API:AWT,Java2D,Acessibility,Drag&Drop以及Swing

  1. AWT:Abstract Window Toolkit,是抽象窗口工具集,包括GUI的各种组件与事件处理机制。
  2. Java 2D:Java二维图形工具,是对java.awt和java.awt.image包的扩展
  3. Accessibility:Java高级访问工具,提供了一组高级的工具帮助程序实现非常规的输入/输出,如屏幕读取器、屏幕放大器、语音处理等。
  4. Drag&Drop:拖放功能,实现Java程序与不支持Java的本地应用之间数据的交换。
  5. Swing:Swing提供了丰富的组件,并提供了独立与运行平台的GUI构造框架。Swing是纯Java实现的轻量级组件,没有本地代码,不依赖于操作系统的支持。Swing在不同的平台上都能具有一致的显示风格,并且能够提供本地窗口系统不支持的其他特性。

二、Swing简介

  • Swing提供了许多图形界面组件,除了按钮、标签、复选框、菜单等基本组件外,还增加了丰富的高层组件集合。
  • 大多数非容器Swing组件都采用一种分离模型结构。这种分离模型结构分为两部分:组件及与组件相关的数据模型。例如某个组件拥有其对应的模型来存储这些同类的组件。对于某些组件,使用分离模型结构具有很大的优点。
    (1)使程序员可以灵活地定义组件数据的存储和检索方式。
    (2)方便组件之间进行数据和状态的共享。
    (3)组件数据的变化将由模型自动传递到所有相关组件中,容易实现GUI与数据之间的同步。
  • Swing组件的外观感觉采用可设置的外观感觉。用户可以自行设置。
  • Swing组件都实现了Accessible接口,提供对非常规高级访问方式的支持,使得一些辅助输入/输出功能,如屏幕阅读器等,能够十分方便地从Swing组件中得到消息。
  • Swing支持键盘代替鼠标的操作。
  • Swing组件可以设置一个或多个边框。Swing中提供了各式各样的边框,用户可以建立组合边框或设计自己的边框。
  • 许多Swing组件上可以使用图标对其进行修饰。

三、Swing组件类层次

Swing组件是围绕一个新的组件类JComponent建立的,JComponent
类是从Container类派生的。

  • javax.swing包是Swing提供的最大包,它包含了近100个类和几十个接口。除了JTableHeader类和JTextComponent类分别在swing.table包和swing.text包中,几乎所有的Swing组件都在这个包中。
  • javax.swing.event包和AWT的event包类似,包含了事件类和监听器接口。
  • javax.swing.table包主要包括了表格组件JTable的相关类。
  • javax.swing.tree包主要包括了树组件JTree的相关类
  • javax.swing.filechooser包主要包括了JFileChooser的相关类
  • javax.swing.border包中主要包括了设置特定组件边框的类和接口
  • javax.swing.text,javax.swing.text.html,javax.swing.text.html.parser和javax.swing.text.rtf都是用于显示和编辑HTML和RTF格式文档的包
  • javax.swing.plaf,javax.swing.plaf.basic,javax.swing.plaf.metal,javax.swing.plaf.multi是实现组件各种显示L&F(组件外观感觉)的包。

四、创建基于Swing的应用程序GUI

创建一个用Swing显示的程序一般包含一下步骤

  1. 引入swing包,以及各种需要的包。
  2. 选择GUI的外观风格L&F,一般在main方法中,在创建顶层容器之前设置GUI的外观风格。
  3. 创建并设置窗口容器,创建GUI的顶层容器并进行布局管理器等设置
  4. 创建与添加Swing组件,创建所需的Swing组件,进行相应设置后添加到容器中显示。注意避免Swing组件与AWT组件混合使用,在SwingGUI中应该全部使用基于Swing的轻量级组件。
  5. 显示顶层容器,将整个GUI显示出来。
	UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
	JFrame frame = new JFrame("HelloWorld");
	final JLabel label = new JLabel("Hello World");
	frame.getContentPane().add(label);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setSize(200, 70);
	frame.setVisible(true);

五、L&F设置

使用UIManager.setLookAndFeel()这个方法并传入参数来设置GUI的外观风格,一般这个方法调用都在第一行代码处,否则可能设置不生效。

这个方法的参数一般有:

  • 跨平台的JavaL&F:UIManager.getCrossPlatformLookAndFeelClassName()
  • 当前运行平台的L&F:UIManager.getSystemLookAndFeelClassName()
  • WindowsL&F:“com.sun.java.swing.plaf.windows.WindowsLokkAndFeel”

当GUI已经显示之后,如果需要改变L&F,仍可以调用UIManager.setLook
AndFeel(),不过需要调用SwingUtilities.updateComponentTreeUI(),传入每个顶层容器。

六、常用容器

组成GUI的组件和按钮、标签、对话框等,不能独立使用,必须放再容器内。所有的组件都可以通过add()方法向容器中添加组件。在Swing中,常用的3种类型的容器是JFrame,JPanel和JApplet。Swing GUI形成顶层容器-中间层容器-基本组件的层次包容关系。

(一)顶层容器

  • 具有Swing GUI的因公用必须至少有一个顶层容器。顶层容器提供了所包含组件需要的绘制与时间处理功能。对于多数应用,顶层容器是JFrame,JDialog或JApplet的实例。
  • 每个顶层容器都有一个内容面板(Content Pane),可能还有一个菜单条(Menu Bar),内容面板中直接或间接包含了该容器的组件。
  • Swing组件不能直接添加到顶层容器中,必须添加到一个与顶层容器相关联的内容面板中。或者建立一个JPanel或JDesktopPane等中间容器,把组件添加到中间容器中,再将该容器设置为顶层容器的内容面板。
    示例:
JFrame frame = new JFrame();
frame.getContentPane().add(new JLable("hello");

或者

扫描二维码关注公众号,回复: 8900919 查看本文章
JPanel contentPane = new Jpanel();
JbButton b = new JButton("确定");
contentPane.add(b);
frame.setContent(contenePane);
  • JFrame是最常用的顶层容器。
    (1)它有两个构造方法,JFrame(),JFrame(String titile)。
    (2)JFrame通过setVisible()来设置窗口是否可见
    (3)JFrame通过setDefaultCloseOperation(int operation)来设置单击关闭窗口按钮操作,可选的参数有(4)WindowConstants.DO_NOTHING_ON_CLOSE:不做任何动作
    (4)WindowConstants.HIDE_ON_CLOSE:隐藏窗口
    (5)WindowConstants.DISPOSE_ON_CLOSE:关闭窗口,释放资源
    (6)JFrame.EXIT_ON_CLOSE:退出应用系统
    (7)JFrame通过setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated)来制定窗口是否使用当前Look&Feel提供的窗口装饰。窗口装饰指窗口的边框,标题以及用来关闭与最小化窗口的按钮。

(二)中间层容器

中间层容器是由通用容器构成,主要是为了简化组件的布局,常用组件为JPannel,JScrollPane,JTabbedPan等。

  • JPannel是存放轻型组件的同样能够容器,并且默认情况下是透明的,可以使用setOpaque()方法设置。JPanel的对象可以作为顶层容器的Content Pane使用。通过setLayout()方法设置JPanel的布局管理器,并向其中添加组件。
  • JScrollPane,JScrollPane类可提供轻量级组件的 scrollable 视图。JScrollPane 管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口。

七、布局管理器

为了实现跨平台的特性并获得动态的布局效果,Java在容器设置了布局管理器负责对容器内的组件进行管理。布局管理器决定容器的布局策略以及容器内组件的排列顺序、组件大小和位置,以及当窗口移动或者调整大小之后组件如何变化等。每个容器都有一个默认的布局管理器,该布局管理器可通过调用setLayout()改变。

(一)FlowLayout

  • 流式布局管理器,容器内的组件采用从左到右,从上倒下逐行摆放。

  • 构造方法有
    FlowLayout():组件居中摆放,组件之间水平和垂直间距为5个像素
    FlowLayout(int align):组件按照参数指定的对齐方式摆放,组件之间水平和垂直间距为5个像素。参数align的取值有FlowLayout.LEFT,FlowLayout.RIGHT,FlowLayout.CENTER
    FlowLayout(int align,int hgap,int vgap):组件按照指定的对齐方式摆放,组件之间的水平间距由hgap指定,垂直间距由vgap指定。

(二)BorderLayout

  • 边界布局管理器,将容器分为五个区,East,West,South,North,Center
    在这里插入图片描述
  • 构造方法
    BorderLayout():组件之间没有水平间隙与垂直间隙
    BorderLayout(int hgap,int vgap):指定组件之间水平间隙与垂直间隙
  • 当改变容器窗口大小的时候,各个组件的相对位置不变,组件大小改变。
  • 当向容器中加入组件时,需要指定摆放的方位,否则组件不能显示。可以通过容器类的两个add方法。
    public Component add(String name,Component comp),参数name指定方位,取值为BorderLayout.EAST,BorderLayout.WEST,BorderLayout.NORTH,BorderLayout.SOUTH
    public void add (Component comp,Object constraints),参数constraints指定方位,取值同上。

(三)GridLayout

  • 网格布局管理器,把容器分为n行n列同样大小的网格单元,每个网格单元可以容纳哦一个组件,并且此组件将充满网格单元。组件按照从左至右,从上至下的顺序填充。
  • 构造方法
  • GridLayout(),容器划分为1行1列的网格
    GridLayout(int rows,int cols),容器划分为指定行列数目的网格。当取值为 0时代表任意数目的行列。
    GridLayout(int rows,int cols,int hgap,int vgap),容器划分为指定行列数目的网格。并且指定组件间的水平与垂直间隙。

(四)CardLayout

  • 卡片布局管理器,可以使两个或者更多的组件共享同一显示控件。像卡片一样叠放,一个时刻只有最上面的组件是可见的。

  • 构造方法
    CardLayout():没有左右与上下边界间隙
    CardLayout(int hgap,int vgap):通过参数指定左右上下边界的间隙。:

  • 常用的方法有
    public void first(Container parent):显示第一张卡片
    public void next(Container parent):显示下一张卡片,如果当前卡片是最后一张,则显示打一张
    public void prevoius(Container parent):显示前一张卡片
    public void last(Container parent):显示最后一张卡片
    public void show(Container parent,String name):显示指定名称的组件

  • 当一个由CardLayout管理的容器中添加组件时,必须使用Container类下的add(String name,Component comp)方法。

(五)GridBagLayout

  • 网格包布局管理器,最复杂,最灵活的布局管理器
  • GridBagLayout所管理的每个组件都与一个GridBagConstraints类的对象相关。这个约束对象指定了组件的显示区域在网格中的位置,以及在其显示区域中应该如何摆放组件。
  • GridBagConstraints对象的定制是通过设置下列一个或多个GridBagConstraints的变量实现:
    (1)gridx,gridy:指定组件在网格中的行与列,容器中最左列的gridx=0,最上边行的gridy=0,。这两个变量的默认值是GridBagConstraints.RELATIVE,表示对应的组件将放在前面放置的组件的右边或者下面。
    (2)gridwidth,gridheight指定组件显示区域所占的列数与行数,以网格单元而不是像素为单位,默认值是1.GridBagConstraints.REMAINDER指定组件是在所在行或列的最后一个组件。而GridBagConstraints.RELATIVE指定组件是所在行或列的倒数第二个组件。
    (3)fill:指定组件填充网格的方式。可以是GridBagConstraints.NONE(默认),GridBagConstraints.HORIZONTAL(组件横向充满显示区域,但不改变组件高度)
    GridBagConstraints.VERTICAL(组件纵向充满显示区域,但不改变组件宽度)
    GrudBagConstraints.BOTH(组件横向、纵向充满其显示区域)
    (4)ipadx,ipady:指定组件显示区域的内部填充,指定组件显示区域的内部填充,即在组件最小尺寸之外需要附加的像素数。默认值是0。
    (5)insets:指定组件显示区域的外部填充,即组件与其显示区域边缘之间的控件,省略时,组件没有外部填充。
    (6)anchor:指定组件在显示区域的摆放位置。可以是GridBagConstraints.CENTER
    GridBagConstraints.NORTH
    GridBagConstraints.NORTHEAST
    GridBagConstraints.EAST
    GridBagConstraints.SOUTHEAST
    GridBagConstraints.SOUTH
    GridBagConstraints.SOUTHWEST
    GridBagConstraints.NORTHWEST
    (7)weightx,weighty:用来指定在容器大小改变时,增加或减少的控件如何在组件间分配。默认值是0,即所有的组件将巨龙在容器的中心,多余的控件放在容器边缘和网格单元之间。取值一般在0.0-1.0

(六)BoxLayout

  • 箱式布局管理器,将组件垂直摆放在一列或者水平摆放在一行中,具体由BoxLayout.X_AXIS和BoxLayout.Y_AXIS指定。
发布了38 篇原创文章 · 获赞 11 · 访问量 1786

猜你喜欢

转载自blog.csdn.net/weixin_44247784/article/details/102767655