Java的GUI编程

GUI

图形用户界面(Graphic User Interface,简称GUI)是一种被大家广泛接受的人机交互方式,是当今计算机发展的重大成就之一,与字符(或命令行)界面不同,是指采用图形方式显示的计算机操作环境的用户接口。

在这里插入图片描述

  • Sun已经提供了一个跨平台GUI开发工具包 AWT 抽象窗口工具箱(Abstract Window Toolkit)。
  • Sun又创建了一个新的GUI框架 swing 。解决了AWT存在的Icd问题。
  • IBM认为swing比较消耗内存,创建了一个新的GUI库,这就是 SWT
  • IBM为了方便开发SWT程序,在SWT基础上又创建了一个更易用,功能强大的图开包 JFace

AWT (Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包。 AWT 的图形函数与操作系统提供的图形函数有着一一对应的关系。也就是说,当我们利用 AWT 构件图形用户界面的时候,实际上是在利用操作系统的图形库。

AWT 的层次关系
在这里插入图片描述
Swing :为解决 AWT 存在的问题而新开发的图形界面包。Swing 是对AWT的改良和扩展。 不仅提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充,与平台无关。

Swing 组件层次关系
在这里插入图片描述

Swing的常用组件

1、文本框(JTextField)
 2、密码框(JPasswordField)
 3、标签(JLable)
 4、按钮(JButton)
在这里插入图片描述
 5、复选框组件(JCheckBox)
 6、单选框组件(JRadioButton):同一组单选按钮必须先创建ButtonGroup,然后把单选框组件放入到ButtonGroup中。
在这里插入图片描述
 7、下拉框(JComboBox)
 8、列表框(JList)
 9、滚动窗格(JScrollPane)
在这里插入图片描述
 10、拆分窗格(JSpitPane):属于容器类组件。
 11、JTextArea:多行文本框。
 12、JTabbedPane:选项卡窗格(业签组件)。
 13、JMenuBar:菜单条组件
 14、JMenu:菜单组件
 15、JMenuItem:菜单项组件
 16、JToolBar:容器类组件

容器

容器 是用来容纳其他组件和容器的特殊组件,是由容器类(Container类)创建的对象。容器类是组件类(组件类Component类)的一个子类,具有组件的所有性质。

AWT 技术中,容器类由 java.awt 包提供,主要包括面板类 Panel 、窗口类 Window 、结构类 Frame 、对话框类 Dialog 等。

Swing 技术中,容器类由 javax.swing 包提供,并可分为如下三类:

  • 顶层容器:JFrameJAppletJDialogJWindow
  • 中间容器:JPanelJScrollPaneJSplitPaneJDesktopPaneJToolBar
  • 特殊容器:在GUI 上起特殊作用的中间层,如JInternalFrameJLayeredPaneJRootPane

注意:

  • 顶层容器可以独立显示,而其他2类必须放在一定容器中才能显示。
  • 使用Java语言编写GUI程序时,需要首先创建某种顶层容器,然后指定其所用布局管理器,接着用 add() 方法放入创建好的各组件。
  • JFrameSwing 编写GUI程序最常用的容器类,可以用来创建窗体作为顶层容器。

面板

引入面板可以更好地管理组件:

  • 如果不使用面板,界面将无法分区或分块,所有组件只能采用一种布局方式,这很难设计出美观的界面;
  • 一些布局方式只能管理有限个组件,如果不用面板,窗体中只放置有限个组件,则无法满足应用需要。例如,JFrame 窗体的默认布局管理器是BorderLayout,它最多管理5个组件;
  • 窗体呈现的显示区域有限,组件较多时很难放下或合理安排,引入带滚动条的JScrollPane和可分割界面的JSplitPane面板将能更好地表达界面元素。
  • 常用的面板有三种,均在javax.swing包中:普通面板类 JPanel 带滚动条的 JScrollPane 用于分割界面的 JSplitPane
  • 编写方法:可在JFrame窗体中添加几个面板或主要的组件,而后可继续在已添加的面板中添加多个子面板或组件。

布局管理

Java为我们提供了几个常用的布局管理器类,例如:FlowLayoutBorderLayoutGridLayoutGridBagLayout等。
  
  1、java.awt FlowLayout(流布局)将组件按从左到右而后从上到下的顺序依次排列,一行不能放完则折到下一行继续放置。流式布局可以以左对齐、居中对齐、右对齐的方式排列组件。
在这里插入图片描述
  流式布局不限制他所管理的组件的大小,允许他们有最佳的大小。当容器最缩放时,组件的位置可以改变,但组件的大小不改变。JPanel的默认布局为流式布局管理。
  
  2、java.awt BorderLayout(边界布局)将组件按东、南、西、北、中五个区域放置,每个方向最多只能放置一个组件。
在这里插入图片描述
  JFrame 窗体,JDialog 对话框组件默认布局方法为边界布局(BorderLayout),边界布局的五个部分不是都要添加,中间部分会自动调节大小。
  
  3、java.awt GridLayout(网格布局)形似一个无框线的表格,每个单元格中放一个组件。将容器分割成多行多列,组件被填充到每个网格中,添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其他组件,当占满该行的所有网格后,接着继续在下一行从左到右放置组件。
在这里插入图片描述
  组件的相对位置不随容器的缩放而改变,但大小会改变,所有组件的大小相同。
  可以通过 GridLayout(int rows, int cols, int hgap, int vgap) 来指定网格的行/列,水平间隙/垂直间隙。
  java.awt GridBagLayout 非常灵活,可指定组件放置的具体位置及占用单元格数目。
  
  一个界面只可以有一个JFrame窗体组件,但可以有多个Jpanel面板组件,而JPanel上也可使用各种布局管理器,这样可以组合使用达到较为复杂的布局效果。
  JPanel 是JComponent的子类。默认布局为流式布局(FlowLayout),属于容器类组件,可以加入别的组件。

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MultiLayout extends JFrame {
    private static final long serialVersionUID = 1L;
    
    // 定义组件
    JPanel jp1, jp2;
    JButton jb1, jb2, jb3, jb4, jb5, jb6;

    public static void main(String[] args) {
        new MultiLayout();
    }

    public MultiLayout() {
        // 创建组件
        // JPanel布局默认是FlowLayout流布局
        jp1 = new JPanel();
        jp2 = new JPanel();

        jb1 = new JButton("西瓜");
        jb2 = new JButton("苹果");
        jb3 = new JButton("荔枝");
        jb4 = new JButton("葡萄");
        jb5 = new JButton("桔子");
        jb6 = new JButton("香蕉");

        // 设置布局管理器(Jpanel默认流布局)
        jp1.add(jb1);
        jp1.add(jb2);
        jp2.add(jb3);
        jp2.add(jb4);
        jp2.add(jb5);

        // 把Panel加入JFrame
        this.add(jp1, BorderLayout.NORTH);
        this.add(jb6, BorderLayout.CENTER);
        this.add(jp2, BorderLayout.SOUTH);

        // 设置窗体
        // 窗体大小
        this.setSize(300, 250);
        // 屏幕显示初始位置
        this.setLocation(200, 200);
        // 显示
        this.setVisible(true);
        // 退出窗体后将JFrame同时关闭
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

在这里插入图片描述
4、GroupLayout(分组布局),它将组件按层次分组,以决定它们在 Container 中的位置。GroupLayout 主要供生成器使用,但也可以手工编码。分组由 Group 类的实例来完成。
GroupLayout 支持两种组。串行组 (sequential group) 按顺序一个接一个地放置其子元素。并行组 (parallel group)能够以四种方式对齐其子元素。
  每个组可以包含任意数量的元素,其中元素有 GroupComponent 或间隙 (gap)。间隙可被视为一个具有最小大小、首选大小和最大大小的不可见组件。此外,GroupLayout 还支持其值取自 LayoutStyle 的首选间隙。
  GroupLayout 是一个很重要的布局管理器,在jdk 1.6才加入,配合其它的管理器可以实现很好的界面。GroupLayout 必须要设置它的 GroupLayout.setHorizontalGroupGroupLayout.setVerticalGroup
  GroupLayout.setHorizontalGroup是指按照水平来确定,下面例子“账号”和“密码”是一个级别的,其它的组件也是一个级别的。
  GroupLayout.setVerticalGroup。是按照垂直来确定的。他们的级别是按照Group去设置组件的优先级别,级别越高就显示越上面。

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class GroupLayoutTest extends JFrame {
    private static final long serialVersionUID = -5159330521192113057L;

    public static void main(String[] args) {
        new GroupLayoutTest();
    }

    JLabel label1;
    JLabel label2;
    JLabel label3;
    JTextField tf;
    JPasswordField psf;
    JRadioButton rb1;
    JRadioButton rb2;
    JButton bt1;
    JButton bt2;

    public GroupLayoutTest() {
        this.setVisible(true);
        this.setSize(250, 220);
        this.setVisible(true);
        this.setLocation(400, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        label1 = new JLabel("登陆界面");
        label2 = new JLabel("账号:");
        label3 = new JLabel("密码:");
        tf = new JTextField();
        psf = new JPasswordField();
        rb1 = new JRadioButton("记住密码");
        rb2 = new JRadioButton("自动登陆");
        bt1 = new JButton("登陆");
        
        // 为指定的 Container 创建 GroupLayout
        GroupLayout layout = new GroupLayout(this.getContentPane());
        this.getContentPane().setLayout(layout);
        
        // 创建GroupLayout的水平连续组,,越先加入的ParallelGroup,优先级级别越高。
        GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
        // 添加间隔
        hGroup.addGap(5);
        hGroup.addGroup(layout.createParallelGroup().addComponent(label2).addComponent(label3));
        hGroup.addGap(5);
        hGroup.addGroup(layout.createParallelGroup().addComponent(label1).addComponent(psf).addComponent(rb1)
                .addComponent(rb2).addComponent(tf).addComponent(bt1));
        hGroup.addGap(5);
        // 设置水平分组
        layout.setHorizontalGroup(hGroup);
        
        // 创建GroupLayout的垂直连续组,,越先加入的ParallelGroup,优先级级别越高。
        GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
        vGroup.addGap(10);
        vGroup.addGroup(layout.createParallelGroup().addComponent(label1));
        vGroup.addGap(10);
        vGroup.addGroup(layout.createParallelGroup().addComponent(label2).addComponent(tf));
        vGroup.addGap(5);
        vGroup.addGroup(layout.createParallelGroup().addComponent(label3).addComponent(psf));
        vGroup.addGroup(layout.createParallelGroup().addComponent(rb1));
        vGroup.addGroup(layout.createParallelGroup().addComponent(rb2));
        vGroup.addGroup(layout.createParallelGroup(Alignment.TRAILING).addComponent(bt1));
        vGroup.addGap(10);
        // 设置垂直组
        layout.setVerticalGroup(vGroup);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值