Java学习之图形化界面(Swing基础)

时间:2024-02-29 13:50:03

Java学习之图形化界面(Swing基础)

一、Java图形化界面发展史

       起初在早期的计算机系统中,电脑只提供命令行界面(CLI),现在在Windows中开个DOS窗口,就可以历史足迹,这就是命令行界面在 现在Windows界面中的体现。

       后来Apple公司率先在电脑的操作系统中实现了图形化的用户界面(Graphical User Interface,简称GUI),但由于Apple公司封闭的市场策略,自己完成电脑硬件、操作系统、应用软件一条龙的产品,与其它PC不兼容。这使得Apple公司错过了一次一统全球PC的好机会。

   后来,著名的Microsoft公司推出了风靡全球的Windows操作系统,它凭借着优秀的图形化用户界面,一举奠定了操作系统标准的地位。这也造就了世界首富---比尔.盖茨和IT业的泰山北斗微软公司。

  在图形用户界面风行于世的今天,一个应用软件没有良好的GUI是无法让用户接受的。而Java语言也深知这一点的重要性,它提供了一套可以轻松构建GUI的工具。 

 

二、Java语言提供的GUI构建工具

  分为“组件”(component)和“容器”(container),光有“组件”是不能组装成程序的,我们必须使用“容器”将这些“组件”装配起来,使其成为一个整体。以我的理解来说,组件就是一个图形化界面中的一个个组成元件,容器JFrame就是将这些元件容纳进来,形成一个整体,组件在JFrame容器中进行布局,然后生成一个完整的图形化界面。容器JDialog 是依附于组件上的对话框,当它所依赖的窗口或组件消失,对话框也将消失。比如点击按钮弹出确认键。

  Java中提供以下10种组件:

  • 标签
  • 文本框
  • 列表框
  • 选择框
  • 复选框
  • 按钮
  • 单选按钮
  • 滚动条
  • 画布
  • 菜单

  Java语言是通过AWT(抽象窗口化工具包)和Java基础类(JFC或更常用的Swing)来提供这些GUI组件的。

  其中Java.awt是最原始的GUI工具包,存放在java.awt包中。Java 1.0提供的AWT在所有的系统上表现得都不太好,而且限制颇多:只能使用四种字体,不能访问存在于本地操作系统上的任何成熟的DUI组件,且AWT编程模型非常笨拙,并且不是面向对象的。(可能是最初版本的AWT是在一个月内构思、设计和实现的原因,借此说明精心设计的重要性!)现在有许多功能被已被Swing取代并得到了很大的增加与提高,因此一般我们很少再使用Java.awt,但是AWT中还是包含了最核心的功能,通常,一个Java的GUI程序至少还要使用下面几个类:

  • java.awt.Color:基本颜色定义
  • java.awt.Font:基本字体定义
  • java.awt.Cursor:光标操作定义

  而Swing是JAVA提供的一组丰富的与平台无关的方式来创建图形用户界面的库。

  Swing特点

  • Swing中有一个令人称道的原则,称为“正交使用(orthogonality of use)”,意思是一旦了解了库中的某个通用概念,就可以把这个概念应用到其他地方。比如标准的命名约定可以仅仅通过方法的名称就能正确猜出其功能。再比如,通常可以把一个组件“插”到另一个组件里面,而且能正常工作。
  • Swing自动支持键盘导航:可以不用鼠标运行Swing程序,而且不用额外编写代码。
  • Swing还支持称为“可插式外观”(pluggable look and feel),意思是用户界面的外观可以动态改变,以适应不同平台和操作系统下用户的习惯。

  Java中提供以下2种容器

  • 窗口(Form)
  • 对话框(Dialog)

 

三、组件(JComponent)

  Swing的整个可视组件库的基础构造块是JComponent,它是所有组件的父类,并且是一个抽象类,所以我们不能直接创建JComponent对象,但是作为类层次结构的基础。

  •   组件基本通用构成元素及设置方法

  以组件JLable jlable为例

(一)边框 

  组件默认的边框是一个黑边的矩形

  设置组件的边框:

1 public void setBorder(Border border)

  该方法的参数是一个接口,必须向该参数传递一个实现接口Border类的实例。如果传递一个null,组件将取消边框。 

(二)颜色

1 public void setBackground(Color c)    //设置组件的背景色。
2 public void setForeground(Color c)    //设置组件的前景色。
3 public Color getBackground(Color c)  //获取组件的背景色。
4 public Color getForeground(Color c)   // 获取组件的前景色。
5 public Color(int red,int green,ing blue)    //创建一个颜色对象,其中red、green、blue的取值在0到255之间。

eg:   

jlable.setForeground(Color.BLUE)    //设置组件的前景色为蓝色。

(三)字体样式、大小和颜色

public void setFont(Font f)   // 组件调用该方法设置组件上的字体。
public Font getFont(Font f)   // 组件调用该方法获取组件上的字体。

  上述方法中用到了java.awt包中的Font类,Font类的构造方法是:

public Font(String name,int style,int size)     // 创建字体对象。name是字体样式的名字,style决定字体的样式(1是粗体,0是平常的),size是字体大小,取值是一个整数。

eg:

jlable.setFont(new Font("宋体",1,15)) //设置JLable字体为宋体,加粗,大小为15

(四)大小和位置

1 public void setSize(int width,int height)  //设置组件的大小。
2 public void setLocation(int x,int y)  //设置组件在容器中的位置,组件距容器的左、上边界 x、y 个像素。
3 public Dimension getSize()  //返回一个Dimension对象的引用,该对象实体中当前组件的宽度和高度。
4 public Point getLocation(int x,int y)  //返回一个Point对象的引用,该对象实体中含有组件的左上角在容器的坐标系中的x坐标和y坐标。
5 public void setBounds(int x,int y,int width,int height)  //设置组件在容器中的位置和组件的大小。
6 public Rectangle getBounds()  //返回一个Rectangle对象的引用,该对象实体中含有当前组件左上角在容器坐标系中的x坐标和y坐标,宽度和高度。

 

(五)透明性

  组件默认是不透明的,我们可以通过方法:

1 public void setOpaque(boolean isOpaque)  

  设置组件是否不透明。isOpaque取false时,组件被设置为透明;isOpaque取true时组件被设置为不透明。

(六)激活与可见性

1 public void setEnabled(boolean b)
/*设置组件是否可被激活。
当参数b取值true时,组件可以被激活。 当参数b取值false 时,组件不可激活。 默认情况下,组件是可以被激活的。*/ 2 public void setVisible(boolean b)
/*设置组件在该容器中的可见性。
当b取值true时,组件在容器中可见。 当b取值false时,组件在容器中不可见。 除了Window型组件外,其它类型组件默认是可见的。*/
  •            组件的不同类型

(1)标签(JLable)

  标签组件,一般用来显示信息,但没有编辑功能。

  常用构造方法:

  • public JLabel():创建空标签对象。
  • public JLabel(String text):创建带文本的标签对象。
  • public JLabel(String text, int aligment):创建带文本的标签对象,并设置文本对齐方式

  常用方法:

  • String getText():获取标签的名字。
  • void setText(String s):设置标签的名字。

(2)文本框

   

  单行文本框

  用来建立文本框的组件,用户可以在文本框中输入单行的文本。

  常用构造方法:

  • JTextField(int x):创建文本框对象,可以在文本框中输入若干个字符,文本框的可见字符个数由参数x指定。
  • JTextField(String s):创建文本框对象,则文本框的初始字符串为s,可以在文本框中输入若干个字符。 常用方法: public void setText(String text):设置文本框中的文本为参数text指定的文本。 public String getText():获取文本框中的文本。 public void setEditable(boolean b):指定文本框的可编辑性(默认为true-可编辑的)。 public void setHorizontalAlignment(int alignment):设文本在文本框中的对齐方式,其中alignment的有效值确定对齐方式,如:LEFT、CENTER、RIGHT。 

  JPasswordField 密码框

  用于接收密码信息,输入的文本不会以明文形式显示出来。

  常用方法:

  • setEchoChar(char echoChar):设置回显字符(默认的回显字符是‘*’)。
  • char[] getPassword():获取密码框中的密码。

  JTextArea 多行文本框

  用户可以在文本区输入多行的文本。

  常用构造方法:

  • JTextArea(int rows, int columns):构造一个可见行和可见列分别是rows、columns的文本区。

  常用方法:

  • setLineWrap(boolean b):决定输入的文本能否在文本区的右边界自动换行。
  • setWrapStyleWord(boolean b):决定是以单词为界(b取true时)或以字符为界(b取false时)进行换行。
  • getText():获取文本区的文本。
  • setText(String text):设置文本内容。
  • append(String text):尾部加文本。
  • insert(String text,int index):在文本区的指定位置处插入文本。
  • public void copy():拷贝选定的区域。
  • public void cut():剪切选定的区域。
  • public void paste():在指定的区域粘贴。 

(3)列表框

  表格对象。(JTable)

  常用构造方法:

  • public JTable(Object[][] data , Object[] columnName)
    • 表格的视图将以行和列的形式显示数组data每个单元中对象的字符串表示。
    • 参数columnName用来指定表格的列名。
    • 用户在表格单元中输入的数据都被认为是一个Object对象。
    • 用户通过表格视图对表格单元中的数据进行编辑,以达到修改二维数组data中对应的数据。 

  分组框(JComboBox)

  即下拉列表。用户可以在下拉列表看到第一个选项和它旁边的箭头按钮,当用户单击箭头按钮时,列表选项打开。

  常用构造方法:

  • public JComboBox():创建一个没有选项下拉列表。

  常用方法:

  • public void addItem(Object anObject):增加选项。
  • public int getSelectedIndex():返回当前下拉列表中被选中的选项的索引,索引的起始值是0。
  • public Object getSelectedItem():返回当前下拉列表中被选中的选项。
  • public void removeItemAt(int anIndex):从下拉列表的选项中删除索引值是anIndex 选项。
  • public void removeAllItems():删除全部选项。 public void
  • addItemListener(ItemListener):向下拉列表增加ItemEvent事件的监视器。 

(4)复选框(JCheckBox)

  复选框,提供两种状态,一种是选中,另一种是未选中,用户通过单击该组件切换状态。如果不对复选框进行初始化设置,默认的初始化设置均为未选中。

  常用构造方法:

  • public JCheckBox():创建一个没有名字的复选框。
  • public JCheckBox(String text):创建一个名字是text的复选框。

  常用方法:

  • public void setSelected(boolean b):设置按钮状态--是否选中
  • public boolean isSelected():如果复选框处于选中状态该方法返回true,否则返回false。 

(5)按钮(JButton)

  按钮组件

  常用构造方法:

  • public JButton(String text):创建名字是text的按钮。
  • public JButton(Icon icon):创建带有图标icon的按钮。
  • public JButton(String text, Icon icon):创建名字是text且带有图标icon的按钮。

  常用方法:

  • public String getText():获取当前按钮上的名字。
  • public void setText(String text):重新设置当前按钮的名字,名字由参数text指定。
  • public Icon getIcon():获取当前按钮上的图标。
  • public void setIcon(Icon icon):重新设置当前按钮上的图标。
  • public void setHorizontalTextPosition(int textPosition):设置按钮名字相对按钮上图标的水平位置。

  textPosition取值:

  SwingConstants.RIGHT

  SwingConstants.LEFT

  SwingConstants.CENTER

  SwingConstants.LEADING

  SwingConstants.TRAILING

  • public void setVerticalTextPosition(int textPosition):设置按钮上名字相对按钮上图标的垂直位置。
  • public void addActionListener(ActionListener):按钮对象调用该方法可以向按钮增加动作监视器。
  • public void removeActionListener(ActionListener):按钮对象调用该方法可以移去按钮上的动作监视器。

(6)单选按钮(JRadioButton)

  单选按钮

  一组单选按钮同一时刻只能有一个被选中。

  当创建了若干个单选按钮后,应使用ButtonGroup再创建一个对象,然后利用这个对象把这若干个单选按钮归组。归到同一组的单选按钮每一时刻只能选一。 

(7)菜单  

    

  Swing菜单由菜单条(JMenuBar)、菜单(JMenu)和菜单项(JMenuItem)构成。

  菜单条是所有菜单和菜单项的根(容器)。

   JMenuBar

   JMenuBar是JComponent类的子类,负责创建菜单条。

1 JMenuBar menuBar=new JMenuBar(); 

   将菜单条放置到JFrame窗口中:

1 public void setJMenuBar(JMenuBar menubar);

   需要注意的是,只能向窗口添加一个菜单条。

  JMenu

  JMenu是JComponent类的间接子类,负责创建菜单。

  构造方法:

  • pulbic JMenu():建立一个没有标题的菜单。
  • pulbic JMenu(String title):建立一个指定标题菜单,标题由参数title确定

  常用方法:

  • add(MenuItem item):向菜单增加由参数item指定的菜单选项对象。
  • add(String s):向菜单增加指定的选项。
  • getItem(int n):得到指定索引处的菜单选项。
  • getItemCount():得到菜单选项数目。

eg:

  创建一个名为“Edit”的菜单,并添加到菜单条中:

1 JMenu editMenu=new JMenu(“Edit”);  
2 menuBar.add(editMenu); 

   JMenuItem

   JMenuItem是JComponent类的间接子类,负责创建菜单项。

  常用构造方法:

  • public JMenuItem(String s):构造有标题的菜单项。
  • public JMenuItem(String text, Icon icon):构造有标题和图标的菜单项。 创建图标对象 Icon icon=new ImageIcon(“图标文件名”);

  常用方法:

  • public void setEnabled(boolean b):设置当前菜单项是否可被选择。
  • public String getLabel():得到菜单选项的名字。
  • public void setAccelerator(KeyStroke keystroke):为菜单项设置快捷键。

  KeyStroke类静态方法:

1 public static KeyStroke getKeyStroke(int keyCode, int modifiers)

     keyCode一般取值范围:KeyEvent.VK_A~KeyEvent.VK_Z

   modifiers一般取值:InputEvent.ALT_MASK,InputEvent.CTRL_MASK,InputEvent.SHIFT_MASK

eg:

  创建一个菜单项,并将其放在“Edit”菜单里:

1 JMenuItem pasteItem=new JMenuItem(“Paste”);   
2 editMenu.add(pasteItem);

    嵌入JMenu子菜单

  菜单项本身也可以是一个菜单,我们称这样的菜单项为子菜单。如:

1 JMenu editMenu = new JMenu(“Edit”);   
2 JMenu optionsMenu = new JMenu(“Options”);   
3 editMenu.add(optionsMenu);

  弹出式菜单(JPopupMenu)

  由JPopupMenu类负责创建,通常用于右键菜单。

  常用构造方法:

  • public JPopupMenu():构造无标题弹出式菜单。-
  • public JPopupMenu(String label):构造由参数label指定标题的弹出式菜单。

  常用方法:

  • public void show(Component invoker, int x, int y):设置弹出式菜单在组件invoker上的弹出的位置。 

 

四、容器(container)

  以容器JFrame jframe为例

(一)JFrame

  JFrame类是一个顶层窗口,也是一个容器,允许将其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。它有许多其他好处,我们先看最简单的图片:

  JFrame实际上不仅仅让您把组件放入其中并呈现给用户。比起它表面上的简单性,它实际上是 Swing 包中最复杂的组件。为了最大程度地简化组件,在独立于操作系统的Swing组件与实际运行这些组件的操作系统之间,JFrame起着桥梁的作用。JFrame在本机操作系统中是以窗口的形式注册的,这么做之后,就可以得到许多熟悉的操作系统窗口的特性:最小化/最大化、改变大小、移动。

  常用构造方法:

  • JFrame():可以创建一个无标题的窗口
  • JFrame(String title):创建一个标题为title的窗口

  常用方法:

  • getTitle()/setTitle():获取/设置窗口的标题。
  • getState/setState():获取/设置窗口的最小化、最大化等状态。
  • isVisible()/setVisible():获取/设置窗口的可视状态(即是否在屏幕上显示)。
  • getLocation/setLocation():获取/设置窗口在屏幕上应当出现的位置。
  • getSize()/setSize():获取/设置窗口的大小。
  • setBounds():获取/设置窗口出现在屏幕上时的初始位置与大小。
  • setResizable():设置窗口是否可调整大小,窗口默认是可调整大小的。
  • add():将组件添加到窗口中。
  • setDefaultCloseOperation() :设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。 

(二)JDialog(对话框类)

     

  JDialog类是Window的子类。对话框必须要依赖于某个窗口或组件,当它所依赖的窗口或组件消失,对话框也将消失;当它所依赖的窗口或组件可见时,对话框又会自动恢复。   我们通过建立JDialog的子类来建立一个对话框类。不可以把组件直接添加到对话框中,不能为对话框设置布局,可以使用getContentPane()方法得到内容面板。

  对话框可分为无模式和有模式两种:

  • 如果一个对话框是有模式的对话框,那么当这个对话框处于激活状态时,只让程序响应对话框内部的事件,程序不能再激活它所依赖的窗口或组件,而且它将堵塞当前线程的执行,直到该对话框消失不可见。
  • 无模式对话框处于激活状态时,程序仍能激活它所依赖的窗口或组件,它也不堵塞线程的执行。

  消息对话框:

  消息对话框是有模式对话框。

  进行一个重要的操作动作之前,最好能弹出一个消息对话框以确定操作。 可以用javax.swing包中的JOptionPane类的静态方法:

1 public static void showMessageDialog (Component parentComponent,String message,String title, int messageType) 

   创建一个消息对话框。参数分别是对话框所依赖的组件、对话框上显示的消息,对话框的标题,对话框的外观。

  确认对话框:

  确认对话框是有模式对话框。

  可以用javax.swing包中的JOptionPane类的静态方法创建一个确认对话框: 

1 public static int showConfirmDialog (Component parentComponent,Object message,String title,int optionType)

    颜色对话框:

  可以用javax.swing包中的JColorChooser类的静态方法: 

1 public static Color showDialog (Component component,String title,Color initialColor)  

   创建一个颜色对话框。参数component指定对话框所依赖的组件,title指定对话框的标题;initialColor指定对话框返回的初始颜色。

  文件对话框:

  文件对话框提供从文件系统中进行文件选择的界面。

  JFileChooser对象调用下列方法:

1  showDialog(Component parent,String s) 
2  showOpenDialog(Component parent)
3  showSaveDialog(Component parent)

  以上方法都可以使得一个有模式对话框显示在桌面上,该对话框称作文件对话框。

  文件对话框将在参数指定的组件parent的正前方显示,如果parent为null,则在系统桌面的正前方显示。

 

五、容器JFrame与组件的组合

1 add( )  //将组件添加到该容器中。
2 removeAll()   //移掉容器中的全部组件。
3 remove(Component c)   //移掉容器中参数指定的组件。
4 validate()  //每当容器添加新的组件或移掉组件时,调用该方法以保证容器中的组件能正确显示出来。

eg:

jframe.add(jlable)  //将组件jlable添加到容器frame中

 六、布局管理器

   

  作用:

  • 指定各个视图组件在窗口中的分布位置,实现动态布局。
  • 有助于创建复合式的复杂界面,一个复合式界面由一些简单的基本界面组成。

   布局管理器的类型:

  • 流布局管理器:FlowLayout
  • 边界布局管理器:BoderLayout
  • 卡片式布局管理器:CardLayout
  • 网格布局管理器:GridLayout
  • 盒式布局管理器:BoxLayout

   我们使用方法 setLayout(LayoutManager) 来设计自己的布局。

   BorderLayout 边界布局管理器

  这是Window型容器的默认布局,比如Jframe类、JDialog类。

  每个被BorderLayout管理的容器均被划分为五个区域:东(EAST),南(SOUTH),西(WEST),北(NORTH),中(CENTER)。

  容器的每个区域,只能加入一个组件,如果试图加入多个组件,其中只有一个组件是可见的。   对于东南西北这四个边界区域,如果,其中的某个区域没有用,它的大小将变为0,CENTER区域将扩展并占用该区域。

   在BorderLayout布局管理器的管理下,组建必须通过add()方法加入到容器的五个命名区域之一,否则它们是不可见的。方法:add(组件, 区域)

  FlowLayout 流式布局管理器

  将组件按照加入的顺序逐个地放在容器中的一行上,一行放满后再另起一个新行。

   每一行中的组件按布局指定的方式对齐方,默认情况下是居中对齐。

   FlowLayout布局管理器不强行设定组件的大小,而是允许组件拥有自己希望的大小。

  每个组件都有一个getPreferredSize()方法,容器布局管理器会调用此方法取得每个组件希望的大小。

  FlowLayout布局管理器是JPanle容器的默认布局管理器。

   GridLayout 网格式的布局管理器

  它将容器空间划分成若干行乘若干列的网格,每个格放一个组件。

  各组件按照从上到下,从左至右的顺序排列。

  使用GridLayout布局设计的一般步骤:

    1. 使用GridLayout的构造方法创建布局对象,指定划分网格的行数和列数。
    2. 使用GridLayout布局容器调用方发add将组件加入容器。

  GridLayout布局中每个网格都是相同大小并且强制组件与网格相同大小。

  CardLayout 卡式布局管理器,

  可以容纳多个组件,但是同一时刻容器只能从这些组件中选出一个来显示,被显示的组件占据容器的整个空间。

  选项卡窗格(JTabbedPane)的默认布局是CardLayout。

  BoxLayout 盒式布局管理器

  Box类创建的容器称作一个盒式容器,盒式容器的的默认布局是盒式布局,而且不允许更改盒式容器的布局。

  行型盒式布局,特点:

  • 容器中组件的上沿在同一水平线上。
  • Box类的类方法createHorizontalBox()可以获得一个具有行型盒式布局的盒式容器。
  • 行型盒式容器中组件间的间距:Box类调用静态方法createHorizontalStrut(int width)可以得到一个不可见的水平Struct类型对象,称做水平支撑。

  列型盒式布局,特点:

  • 容器中组件的左沿在同一垂直线上。
  • Box类的类方法createVerticalBox()可以获得一个具有列型盒式布局的盒式容器。
  • 列型盒式容器中组件间的间距:Box类调用静态方法createVertialStrut(int height)可以得到一个不可见的垂直Struct类型对象,称做垂直支撑。

 

七、中间容器

   

  用来添加组件的轻容器,称为中间容器。包括:

  • JPanel
  • JScrollPane
  • JSplitPane
  • JLayeredPane

  JPanel

  JPanel类用来创建一个面板对象,可以向这个面板添加组件(直接使用add方法)。

   使用时需要把这个面板添加到底层容器或其他中间容器中。

  JPanel面板的默认布局是FlowLayout布局。

   JScrollPane滚动窗格

  把一个组件放到一个滚动窗格中,然后通过滚动条来观察这个组件。

  例如,JTextArea不自带滚动条,如果希望使用带滚动条的多行文本框,可把JTextArea放到一个滚动窗格中。

  JSplitPane 拆分窗格

  将容器拆分成两部分,拆分窗格有两种类型:

  • 水平拆分:用一条拆分线把容器分成左右两部分,拆分线可以水平移动。
  • 垂直拆分:用一条拆分线分成上下两部分,拆分线可以垂直移动。

  JLayeredPane 分层窗格

  如果添加到容器中的组件经常需要处理重叠问题,就可以将组件添加到JLayeredPane容器中。

  JLayeredPane将容器分成5个层,容器使用add(Jcomponent component, int layer)方法添加组件component,并指定component所在的层layer。

  layer取值:

  • DEFAULT_LAYER:最底层
  • PALETTE_LAYER
  • MODAL_LAYER
  • POPUP_LAYER
  • DRAG_LAYER:最上面的层