JAVA基础—GUI编程
一、GUI简介
1、GUI定义
- 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
2、GUI特点
- 人机交互性:GUI主要功能是实现人与计算机等电子设备的人机交互。它是用户与操作系统之间进行数据传递和互动操控的工具,用户可以通过一定的操作实现对电子设备的控制,同时电子设备会将用户操作的结果通过显示屏进行反馈。作为使用电子信息产品的必备环节,图形用户界面实现了人与软件之间的信息交互。这种人机交互性使得用户的操作更加便捷。
- 美观性:对日新月异的电子产品来说,图形用户界面越来越发挥着重要的作用。美观、友好的界面设计往往更能吸引客户,成为企业获得竞争优势的关键。图形用户界面综合了人机工程学、认知心理学、设计艺术学、语言学、社会学、传播学等众多学科领域的知识,现在已经发展为一门独立的学科。1在电子技术飞速发展成熟的今天,电子产品的性能和功能区别已经不是很大,开发者开始更注重产品的美观性。大气的外观、简约的设计风格、良好的视觉效果日益成为影响用户体验的关键因素。由于图形用户界面是多种元素的组合,包含很多艺术性、美观性的设计元素,界面具有美观性,这种美好的视觉感受能够使得用户购买相应的产品,提高企业的经济效益。
- 实用性:GUI的目的是实现人机交互。开发人员研究并设计出具体的用户界面,将晦涩难懂的电脑语言包装成简单易懂的图形,用户通过对图形的识别即可理解复杂的电脑语言背后所表达的内容。图形化的操作方式具有很强的实用性,方便了用户的使用,提高了使用效率。这种创造性的转化使冷冰冰的电子产品变得亲切,从实验室走进千家万户的生活。开发人员通过对图形用户界面的不断优化,使信息、数据的传输更高效,结果运行与反馈更便捷、准确,带来良好的用户体验,实用性很强。
- 技术性:早期电子产品的图形用户界面采用字符界面,需要操作人员具有较高的专业性。文字转化为图形后,相应的数据信息也被转化为图像。用户操作、接收到的信息都是图形对象,不再需要背诵大量的命令符号,无须具备专业知识和操作技能即可实现对电子产品的操作。但简化了的操作过程并不意味着图形用户界面不具有技术性。隐藏在图形对象背后的,是更加专业的代码编写和相关操作。恰恰相反,这些背后的操作更加具有技术性。技术人员编写和设计相关的代码,将字符界面转化为图形界面,以便用户可以利用图形界面实现他们想要操作的内容。这样的转化方式往往需要较高的技术性,所以图形用户界面只是将技术性隐藏起来,而并非不具有技术性。
3、GUI核心技术
- AWT
- Swing
二、AWT
1、AWT图解
2、AWT—容器
2.1、窗口
(1)Frame
- Frame构造方法
//无参构造
public Frame(){}
//传入窗体标题
public Frame(String title){}
import java.awt.*;
public class TextFrame {
public static void main(String[] args) {
//我的第一个窗口
Frame myFrame_01 = new Frame();
//设置窗口标题
myFrame_01.setTitle("我的第一个Frame");
//设置窗口大小
myFrame_01.setSize(1000,600);
//设置窗口位置
myFrame_01.setLocation(100,100);
//设置窗口背景颜色,默认白色
myFrame_01.setBackground(Color.CYAN);
//设置窗口可见
myFrame_01.setVisible(true);
//控制窗口大小是否可改变,默认为True,即可以改变。
myFrame_01.setResizable(false);
//我的第二个窗口同时设置窗口标题
Frame myFrame_02 = new Frame("我的第二个窗口");
//设置窗口位置及大小
myFrame_02.setBounds(100,700,1000,600);
//设置窗口背景颜色,默认白色
myFrame_02.setBackground(Color.CYAN);
//设置窗口可见
myFrame_02.setVisible(true);
//控制窗口大小是否可改变,默认为True,即可以改变。
myFrame_02.setResizable(false);
}
}
- 自定义Frame
import java.awt.*;
public class TextFrame02 {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame{
//继承父类构造器
public MyFrame() {
this("我的窗口");
}
public MyFrame(String title){
this(title, 100, 100,500,300);
}
//自定义构造器
public MyFrame(String title, int x, int y, int width, int height){
this(title, x, y, width, height, Color.white);
}
public MyFrame(String title, int x, int y, int width, int height, Color color){
setTitle(title);
setBounds(x, y, width,height);
setBackground(color);
setVisible(true);
setResizable(false);
}
}
(2)Dialog对话框(弹窗)
- Dialog常用构造方法
// 构造一个最初不可见的 Dialog,它带有指定的所有者 Frame、标题和模式。
public Dialog(Frame frame, String title, boolean modal){}
- Dialog的模式(modal)区别在于:
true的话对话框依附于窗体,不取消Dialog不可以操作窗体;
false的话,不取消Dialog可以操作窗体! - 对话框必须依赖于某个窗口或组件,当它所依赖的窗口或组件消失时,对话框也消失;当它所依赖的窗口或组件可见时,对话框会自动恢复。
//代码详解:Dialog直接依附框架窗体
public class MyDialog {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setVisible(true);
myFrame.setResizable(false);
new MyFristDialog(myFrame);
}
}
class MyFristDialog extends Dialog {
public MyFristDialog(Frame owner) {
super(owner);
setBounds(100,100,100,100);
setBackground(Color.cyan);
setVisible(true);
setResizable(false);
}
}
//代码详解:Dialog通过组件依附框架窗体,需事件监听
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyDialog {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setVisible(true);
myFrame.setResizable(false);
Button MyButton = new Button();
//监听按钮MyButton
MyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyFristDialog(myFrame);
}
});
myFrame.add(MyButton);
}
}
class MyFristDialog extends Dialog {
public MyFristDialog(Frame frame) {
super(frame);
setBounds(100,100,100,100);
setBackground(Color.cyan);
setVisible(true);
setResizable(false);
}
}
2.2、面板
(1)panel
- 面板是一种常见的容器,JPanel的作用是实现接口层次结构,面放入一些组件。也能够在上面绘画,将放有组件和有画的JPanel再放入还有一个容器里。JPanel的默认布局为FlowLayout。
- 面板处理程序的基本内容有下面几个方面:
①通过继承声明JPanel类的子类。子类中有一些组件,并在构造方法中将组件加入面板
②声明JPanel子类对象
③创建JPanel子类对象
④将JPanel子类对象加入到某个容器 - panel构造方法
//创建一个JPanel对象
public JPanel(){};
//创建Jpanel对象时指定布局layout
public JPanel(LayoutManager layout){};
//代码详解
import java.awt.*;
public class TextPanel extends Frame {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setLayout(null);
myFrame.setBackground(Color.CYAN);
myFrame.setVisible(true);
myFrame.setResizable(false);
Panel Panel_01 = new Panel();
//设置panel坐标,相对于frame
Panel_01.setBounds(0,0,200,100);
Panel_01.setBackground(Color.BLACK);
//panel通过布局继续划分区域,每个区域可添加组件或面板
Panel_01.setLayout(new GridLayout(1,2));
Panel Panel_02 = new Panel();
Panel_02.setBounds(300,0,200,100);
Panel_02.setBackground(Color.RED);
Panel Panel_03 = new Panel();
Panel_03.setBounds(0,200,200,100);
Panel_03.setBackground(Color.GREEN);
Panel Panel_04 = new Panel();
Panel_04.setBounds(300,200,200,100);
Panel_04.setBackground(Color.ORANGE);
Button Button_01 = new Button();
Button Button_02 = new Button();
Panel_01.add(Button_01);
Panel_01.add(Button_02);
myFrame.add(Panel_01);
myFrame.add(Panel_02);
myFrame.add(Panel_03);
myFrame.add(Panel_04);
}
}
(2)Applet
- Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同。
2.3、Layout(布局管理器)
布局管理器:布局管理就是用于指定组件的 摆放位置的。每种布局管理器都有自己的摆放风格
- 注意:所有的布局管理器均是针对容器来使用的,包括顶层容器和中间容器。
(1)布局管理器所属类包
(2)容器的默认布局管理器
各容器都有默认的布局管理,见下表:
//代码详解
import javax.swing.*;
import java.awt.*;
public class MyLayout extends Frame {
public static void main(String[] args) {
MyTextFrame Frame_01 = new MyTextFrame("我的第一个框架");
MyTextFrame Frame_02 = new MyTextFrame("我的第二个框架");
MyTextFrame Frame_03 = new MyTextFrame("我的第三个框架");
MyTextFrame Frame_04 = new MyTextFrame("我的第四个框架");
//流式布局
Frame_01.setLayout(new FlowLayout());
//边界布局
Frame_02.setLayout(new BorderLayout());
//网格布局
Frame_03.setLayout(new GridLayout());
... ...
}
}
class MyTextFrame extends Frame{
public MyTextFrame(String title){
setTitle(title);
setBounds(200,200,500,300);
setBackground(Color.CYAN);
setVisible(true);
setResizable(false);
}
}
3、AWT——其他组件
3.1、Label(标识)
- Label构造器
//text不支持中文,会显示不出来
public Label(String text){}
3.2、Button(按钮)
- Button构造器
//创建无标签的按钮
public Button(){}
//label不支持中文,会显示不出来
public Button(String label){}
//代码详解
import java.awt.*;
public class MyButton extends Frame {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setVisible(true);
myFrame.setResizable(false);
Button myButton = new Button();
//设置按钮标签
myButton.setLabel("myButton");
//按钮背景颜色
myButton.setBackground(Color.BLUE);
myFrame.add(myButton);
}
}
3.3、Checkbox(复选框)
- Checkbox构造器
//构造一个无标签复选框条目
public CheckBox(){};
//构造一个以字符串label为标识的复选框条目,未被选中。
public CheckBox(String label)
//代码详解
import java.awt.*;
public class MyCheckbox extends Frame {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setLayout(new GridLayout(2,1));
myFrame.setVisible(true);
myFrame.setResizable(false);
Checkbox myCheckbox_01= new Checkbox("a");
Checkbox myCheckbox_02= new Checkbox("b");
myFrame.add(myCheckbox_01);
myFrame.add(myCheckbox_02);
}
}
3.4、Choice Menu(选择菜单)
- Choice Menu构造器
//构造一个选择菜单,构造完之后,再使用Choice类中的addItem方法加入菜单的条目
public Choice(){}
//代码详解
import java.awt.*;
public class MyChoiceMenu extends Frame {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setLayout(new GridLayout(2,1));
myFrame.setVisible(true);
myFrame.setResizable(false);
Choice myChice_01 = new Choice();
Choice myChice_02 = new Choice();
myChice_01.addItem("a");
myChice_01.addItem("b");
myFrame.add(myChice_01);
myFrame.add(myChice_02);
}
}
3.5、Scrolling List(列表框)
- List构造器
//无参构造列表,默认1
public List(){}
//构造一个有n个列表项的列表框,并根据b的值决定是否允许多选
public List(int n, boolean b){}
//代码详解
import java.awt.*;
public class MyList extends Frame {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setLayout(new GridLayout(2,1));
myFrame.setVisible(true);
myFrame.setResizable(false);
List myList_01 = new List();
List myList_02 = new List(2,true);
myList_02.add("a");
myList_02.add("b");
myFrame.add(myList_01);
myFrame.add(myList_02);
}
}
3.6、TextField(单行文本输入框)
- TextField构造器
//无参构造器单行输入框
public TextField(){}
//构造一个行数为i单行文本输入框
public TextField (int i){}
//代码详解
import java.awt.*;
public class MyTextField extends Frame {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setLayout(new GridLayout(2,1));
myFrame.setVisible(true);
myFrame.setResizable(false);
TextField myTextField_01 = new TextField();
TextField myTextField_02 = new TextField(5);
myFrame.add(myTextField_01);
myFrame.add(myTextField_02);
}
}
3.7、TextArea(多行文本输入框)
- TextArea构造器
//无参构造器多行文本输入框
public TextArea(){}
//构造一个多行文本输入框,行数为i,列数为j
public TextArea (int i, int j){}
//代码详解
import java.awt.*;
public class MyTextArea extends Frame {
public static void main(String[] args) {
Frame myFrame = new Frame("我的框架");
myFrame.setBounds(200,200,500,300);
myFrame.setBackground(Color.CYAN);
myFrame.setLayout(new GridLayout(2,1));
myFrame.setVisible(true);
myFrame.setResizable(false);
TextArea myTextArea_01 = new TextArea();
TextArea myTextArea_02 = new TextArea(5,5);
myFrame.add(myTextArea_01);
myFrame.add(myTextArea_02);
}
}
三、Swing
1、Swing介绍
- Swing是AWT的进阶。
- Swing是JAVA基础类的一部分。
- Swing 是一个为Java设计的GUI工具包。
- Swing 组件采用 MVC(Model-View-Controller,即模型-视图-控制器)的设计,实现 GUI 组件的显示逻辑和数据逻辑的分离,从而允许程序员自定义 Render 来改变 GUI 组件的显示外观,以提供更多的灵活性。
- Swing与AWT比较:
Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
2、Swing—容器
2.1、窗口
(1)JFrame
- 构造器
//构造一个初始时不可见的新窗体。
public MysJFrame(){}
//创建一个具有 title 指定标题的不可见新窗体。
public MysJFrame(String title){}
- 注意:创建一个 JFrame 类的实例化对象后,其他组件并不能够直接放到JFrame容器上,需要将组件添加至内容窗格(Container),而不是直接添加至 JFrame 对象。
//获得内容窗格
Container myContainer = myJFrame.getContentPane();
- Swing 组件需要放到内容窗格的上面,内容窗格再放到 JFrame 顶层容器的上面。菜单栏可以直接放到顶层容器 JFrame 上,而不通过内容窗格。内容窗格是一个透明的没有边框的中间容器。
- JFrame 类中的常用方法如表:
//代码详解
import javax.swing.*;
import java.awt.*;
public class MyJFrame extends JFrame{
public static void main(String[] args) {
//构造一个初始时不可见的新窗体
JFrame myJFrame = new JFrame();
//设置框架窗口位置及大小
myJFrame.setBounds(100,100,500,300);
//设置框架窗口背景颜色,无法看到
myJFrame.setBackground(Color.CYAN);
//设置框架窗口可见
myJFrame.setVisible(true);
//设置框架窗口不可变
myJFrame.setResizable(false);
//获得内容窗格
Container myContainer = myJFrame.getContentPane();
//实际看到颜色与内容窗格一致
myContainer.setBackground(Color.GREEN);
}
}
- 注意:AWT的Frame窗口无法自动关闭,需要设置代码;而Swing中JFrame窗口可以自动关闭。
(2)JDialog
- 构造器
JDialog();
JDialog(Dialog owner);
JDialog(Dialog owner,boolean modal);
JDialog(Dialog owner,String title);
JDialog(Dialog owner,String title,boolean modal);
JDialog(Dialog owner,String title,boolean modal,GraphicsConfiguration gc);
JDialog(Frame owner);
JDialog(Frame owner,boolean modal);
JDialog(Frame owner,String title);
JDialog(Frame owner,String title,boolean modal);
JDialog(Frame owner,String title,boolean modal,GraphicsConfiguration gc);
//无事件监听详细代码
import javax.swing.*;
import java.awt.*;
public class MyJDialog extends JFrame {
public static void main(String[] args) {
//构造一个初始时不可见的新窗体
JFrame myJFrame = new JFrame();
//设置框架窗口位置及大小
myJFrame.setBounds(100,100,500,300);
//设置框架窗口背景颜色,无法看到
myJFrame.setBackground(Color.CYAN);
//设置框架窗口可见
myJFrame.setVisible(true);
//设置框架窗口不可变
myJFrame.setResizable(false);
//获得内容窗格
Container myContainer = myJFrame.getContentPane();
//实际看到颜色与内容窗格一致
myContainer.setBackground(Color.GREEN);
new MyJDialogSon();
}
}
class MyJDialogSon extends JDialog{
public MyJDialogSon() {
//弹窗弹出位置及大小
setBounds(50,50,100,60);
setBackground(Color.BLACK);
setVisible(true);
}
public MyJDialogSon(Frame owner, String title, boolean modal) {
super(owner, title, modal);
}
}
//详细代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyJDialog extends JFrame {
public static void main(String[] args) {
//构造一个初始时不可见的新窗体
JFrame myJFrame = new JFrame();
//设置框架窗口位置及大小
myJFrame.setBounds(100,100,500,300);
//设置框架窗口背景颜色,无法看到
myJFrame.setBackground(Color.CYAN);
//设置框架窗口可见
myJFrame.setVisible(true);
//设置框架窗口不可变
myJFrame.setResizable(false);
//获得内容窗格
Container myContainer = myJFrame.getContentPane();
//实际看到颜色与内容窗格一致
myContainer.setBackground(Color.GREEN);
//Swing必须设置各组件大小
JButton myButton = new JButton();
myButton.setText("弹窗按钮");
myButton.setBounds(100,100,100,60);
myButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyJDialogSon();
}
});
myContainer.add(myButton);
}
}
class MyJDialogSon extends JDialog{
public MyJDialogSon() {
//弹窗弹出位置及大小
setBounds(50,50,100,60);
setBackground(Color.BLACK);
setVisible(true);
}
public MyJDialogSon(Frame owner, String title, boolean modal) {
super(owner, title, modal);
}
}
2.2 、面板
JPanel
- JPanel 是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用。
- JPanel可以添加到JFrame窗口,但一般添加至Cintainer内容窗格,除需JPaner添加菜单组件。
- 常用构造器
//使用默认的布局管理器创建新面板,默认的布局管理器为 FlowLayout
public JPanel();
//创建指定布局管理器的 JPanel 对象
public JPanel(LayoutManagerLayout layout);
- JPanel常用方法:
//代码详解
import javax.swing.*;
import java.awt.*;
public class MyJPanel {
public static void main(String[] args) {
//构造一个初始时不可见的新窗体
JFrame myJFrame = new JFrame();
//设置框架窗口位置及大小
myJFrame.setBounds(100,100,500,300);
//设置框架窗口背景颜色,无法看到
myJFrame.setBackground(Color.CYAN);
//设置框架窗口可见
myJFrame.setVisible(true);
//设置框架窗口不可变
myJFrame.setResizable(false);
myJFrame.setLayout(new GridLayout(2,1));
Container myContainer = myJFrame.getContentPane();
myContainer.setLayout(new GridLayout(2,1));
JPanel myJpanel_01= new JPanel();
JPanel myJpanel_02= new JPanel();
JLabel myJLabel_01 = new JLabel("这是第一个标签");
JLabel myJLabel_02 = new JLabel("这是第二个标签");
myJpanel_01.add(myJLabel_01);
myJpanel_02.add(myJLabel_02);
myContainer.add(myJpanel_01);
myContainer.add(myJpanel_02);
}
}
2.3、Layout(布局管理器)
- Swing中布局管理器与AWT一致,详解见本文章AWT下Layout
- Swing中布局管理器一般通过内容窗格Container和JPanel设置,而非JFrame(JFrame虽同样可以设置)。
3、Swing—其他组件
3.1、JLable(标签)
- 构造器
JLabel():创建无图像并且标题为空字符串的 JLabel。
JLabel(Icon image):创建具有指定图像的 JLabel。
JLabel(String text):创建具有指定文本的 JLabel。
JLabel(String textjcon image,int horizontalAlignment):创建具有指定文本、图像和水平对齐方式的 JLabel,horizontalAlignment 的取值有 3 个,即 JLabel.LEFT、JLabel.RIGHT 和 JLabel.CENTER。
- JLable常用方法:
3.2、JButton(按钮)
- 构造器
JButton():创建一个无标签文本、无图标的按钮。
JButton(Icon icon):创建一个无标签文本、有图标的按钮。
JButton(String text):创建一个有标签文本、无图标的按钮。
JButton(String text,Icon icon):创建一个有标签文本、有图标的按钮。
- JButton常用方法:
3.3、JTextField(单行文本框组件)
- 构造器
JTextField():创建一个默认的文本框。
JTextField(String text):创建一个指定初始化文本信息的文本框。
JTextField(int columns):创建一个指定列数的文本框。
JTextField(String text,int columns):创建一个既指定初始化文本信息,又指定列数的文本框。
- JTextField常用方法:
3.4、JTextArea(文本域组件)
- 构造器
JTextArea():创建一个默认的文本域。
JTextArea(int rows,int columns):创建一个具有指定行数和列数的文本域。
JTextArea(String text):创建一个包含指定文本的文本域。
JTextArea(String text,int rows,int columns):创建一个既包含指定文本,又包含指定行数和列数的多行文本域。
- JTextArea常用方法:
3.5、JCheckBox(复选框组件)
- 构造器
JCheckBox():创建一个默认的复选框,在默认情况下既未指定文本,也未指定图像,并且未被选择。
JCheckBox(String text):创建一个指定文本的复选框。
JCheckBox(String text,boolean selected):创建一个指定文本和选择状态的复选框。
3.6、JRadioButton(单选按钮组件)
-
Swing 中 JRadioButton 类实现单选按钮,它与 JCheckBox 一样都是从 JToggleButton 类派生出来的。JRadioButton 通常位于一个 ButtonGroup 按钮组中,不在按钮组中的 JRadioButton 也就失去了单选按钮的意义。
-
在同一个 ButtonGroup 按钮组中的单选按钮,只能有一个单选按钮被选中。因此,如果创建的多个单选按钮其初始状态都是选中状态,则最先加入 ButtonGroup 按钮组的单选按钮的选中状态被保留,其后加入到 ButtonGroup 按钮组中的其他单选按钮的选中状态被取消。
-
构造器
JRadioButton():创建一个初始化为未选择的单选按钮,其文本未设定。
JRadioButton(Icon icon):创建一个初始化为未选择的单选按钮,其具有指定的图像但无文本。
JRadioButton(Icon icon,boolean selected):创建一个具有指定图像和选择状态的单选按钮,但无文本。
JRadioButton(String text):创建一个具有指定文本但未选择的单选按钮。
JRadioButton(String text,boolean selected):创建一个具有指定文本和选择状态的单选按钮。
JRadioButton(String text,Icon icon):创建一个具有指定的文本和图像并初始化为未选择的单选按钮。
JRadioButton(String text,Icon icon,boolean selected):创建一个具有指定的文本、图像和选择状态的单选按钮。
3.7、 JComboBox(下拉列表组件)
- 下拉列表的特点是将多个选项折叠在一起,只显示最前面的或被选中的一个。选择时需要单击下拉列表右边的下三角按钮,这时候会弹出包含所有选项的列表。
- 用 户可以在列表中进行选择,也可以根据需要直接输入所要的选项,还可以输入选项中没有的内容。
- 构造器
JComboBox():创建一个空的 JComboBox 对象。
JComboBox(ComboBoxModel aModel):创建一个 JComboBox,其选项取自现有的 ComboBoxModel。
JComboBox(Object[] items):创建包含指定数组中元素的 JComboBox。
- JComboBox常用方法:
3.8、JList(列表框)
- 列表框与下拉列表的区别不仅仅表现在外观上,当激活下拉列表时,会出现下拉列表框中的内容。但列表框只是在窗体系上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放到滚动面板中。
- 当用户选择列表框中的某一项时,按住 Shift 键并选择列表框中的其他项目,可以连续选择两个选项之间的所有项目,也可以按住 Ctrl 键选择多个项目。
- 构造器
JList():构造一个空的只读模型的列表框。
JList(ListModel dataModel):根据指定的非 null 模型对象构造一个显示元素的列表框。
JList(Object[] listData):使用 listData 指定的元素构造—个列表框。
JList(Vector<?> listData):使用 listData 指定的元素构造一个列表框。
3.9、JSlider(滑块)
- 滑块(JSlider)是一个允许用户在有限区间内通过移动滑块来选择值的组件
- 构造器
JSlider() 创建一个范围在 0~100 且初始值为 50 的水平滑块
JSlider(BoundedRangeModel brm) 使用指定的 BoundedRangeModel 创建一个水平滑块
JSlider(int orientation) 使用指定的方向创建一个滑块,范围在 0~100 且初始值为 50
JSlider(int min,int max) 使用指定的最小值和最大值来创建一个水平滑块,初始值等于最小值加上最大值的平均值
JSlider(int min,int max,int value) 用指定的最小值、最大值和初始值创建一个水平滑块
- JSIider 类常用方法:
3.10、JProgressBar(进度条组件)
- 进度条(JProgressBar)是一种以可视化形式显示某些任务进度的组件。JProgressBar 类实现了一个用于为长时间的操作提供可视化指示器的 GUI 进度条。
- 在任务的完成进度中,进度条显示该任务完成的百分比。此百分比通常由一个矩形以可视化形式表示,该矩形开始是空的,随着任务的完成逐渐被填充。此外,进度条可显示此百分比的文本表示形式。
- 构造器
//创建一个最小值是0,最大值是100的进度条
JProgressBar pgbar=new JProgressBar(0,100);
//创建一个最小值是0,最大值是60,当前值是20的进度条
JProgressBar pgbar=new JProgressBar(0,60,20);
- JProgressBar常用方法:
3.11、JMenu和JPopupMenu(菜单和弹出式菜单)
-
菜单由 Swing 中的 JMenu 类实现,可以包含多个菜单项和带分隔符的菜单。在菜单中,菜单项由 JMenuItem 类表示,分隔符由 JSeparator 类表示。
-
菜单本质上是带有关联 JPopupMenu 的按钮。当按下“按钮”时,就会显示 JPopupMenu。如果“按钮”位于 JMenuBar 上,则该菜单为顶层窗口。如果“按钮”是另一个菜单项,则 JPopupMenu 就是“下拉”菜单。
-
构造器
JMenu() 创建一个无文本的 JMenu 对象。
JMenu(String s) 创建一个带有指定文本的 JMenu 对象。
- JMenu 类的常用方法:
3.12、JToolBar(工具栏组件)
- 工具栏提供了一个用来显示常用按钮和操作的组件。它可以把任意类型的组件附加到工具条上,但是通常是增加按钮。
- 与 JMenuBar 不一样,JToolBar 对象可以直接被添加到容器中
- 构造器
JToolBar() 创建新的工具栏,默认的方向为 HORIZONTAL
JToolBar(int orientation) 创建具有指定 orientation 的新工具栏
JToolBar(String name) 创建一个具有指定 name 的新工具栏
JToolBar(String name,int orientation) 创建一个具有指定 name 和 orientation 的新工具栏
- JTodBar 类的常用方法:
3.13、JFileChooser和JColorChooser(文件选择器和颜色选择器)
(1)JFileChooser
- 文件选择器为用户能够操作系统文件提供了桥梁。swing 中使用 JFileChooser 类实现文件选择器,该类常用的构造方法如下:
JFileChooser():创建一个指向用户默认目录的 JFileChooser。
JFileChooser(File currentDirectory):使用指定 File 作为路径来创建 JFileChooser。
JFileChooser(String currentDirectoryPath):创建一个使用指定路径的 JFileChooser。
JFileChooser(String currentDirectoryPath, FileSystemView fsv):使用指定的当前目录路径和 FileSystem View 构造一个 JFileChooser。
- JFileChooser 类的常用方法如下所示。
int showOpenDialog(Component parent):弹出打开文件对话框。
int showSaveDialog(Component parent):弹出保存文件对话框。
(2)JColorChooser
JColorChooser 类提供一个用于允许用户操作和选择颜色的控制器窗格。该类提供三个级别的 API:
- 显示有模式颜色选取器对话框并返回用户所选颜色的静态便捷方法。
- 创建颜色选取器对话框的静态方法,可以指定当用户单击其中一个对话框按钮时要调用的 ActionListener。
- 能直接创建 JColorChooser 窗格的实例(在任何容器中),可以添加 PropertyChange 作为监听器以检测当前“颜色”属性的更改。
- 构造器
JColorChooser():创建初始颜色为白色的颜色选取器窗格。
JColorChooser(Color initialColor):创建具有指定初始颜色的颜色选取器窗格。
JColorChooser(ColorSelectionModel model):创建具有指定 ColorSelectionModel 颜色选取器窗格。
-
一般使用 JColorChooser 类的静态方法 showDialog(Component component,String title,Color initialColor) 创建一个颜色对话框,在隐藏对话框之前一直堵塞进程。其中 component 参数指定对话框所依赖的组件,title 参数指定对话框的标题,initialColor 参数指定对话框返回的初始颜色,即对话框消失后返回的默认值。
-
JColorChooser常用方法:
3.14、JOptionPane(对话框组件)
- 对话框通常用作从用户处接收附加信息,或者提供发生了某种事件的通知。
- Java 提供了 JOptionPane 类,用来创建标准对话框,也可以通过扩展 JDialog 类创建自定义的对话框。
- JOptionPane 类可以用来创建 4 种类型的标准对话框:确认对话框、消息对话框、输入对话框和选项对话框。
(1)确认对话框
- 确认对话框显示消息,并等待用户单击“确定”按钮来取消对话框,该对话框不返回任何值。而确认对话框询问一个问题,需要用户单击合适的按钮做出响应。确认对话框返回对应被选按钮的值。
- 构造器
public static int showConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon)
- 参数 parentComponent、message、title、messageType 和 icon 与 showMessageDialog() 方法中的参数的含义相同。其中,只有 parentComponent 和 message 参数是必需的,title 的默认值为“选择一个选项”。messageType 的默认值是 QUESTION_MESSAGE。optionType 参数用于控制在对话框上显示的按钮,可选值如下:
0 或 JOptionPane.YES_NO_OPTIION。
1 或 JOptionPane.YES_NO_CANCEL_0PTII0N。
2 或 JOptionPane.OK_CANCEL_OPTIION。 - showConfirmDialog() 方法返回所选选项对应的值,这些值可以是整数或常量值,如下:
0 或 JOptionPane.YES_OPTIION。
1 或 JOptionPane.NO_OPTIION。
2 或 JOptionPane.CANCEL_OPTIION。
0 或 JOptionPane.OK_OPTIION。
-1 或 JOptionPane.CLOSED_OPTIION。
(2)消息对话框
- 消息对话框显示一条提示或警告用户的信息,并等待用户单击 OK 或“确定”按钮以关闭对话框。创建消息对话框的方法如下:
public static void showMessageDialog(Component parentComponent,Object message,String title,int messageType,Icon icon)
-
其中,只有 parentComponent 参数和 message 参数是必须指定的。parentComponent 可以是任意组件或者为空;message 用来定义提示信息,它是一个对象,但是通常使用字符串表示;title 是设置对话框标题的字符串;messageType 是以下整型或常量中的一个。
0 或 JOptionPane.ERROR_MESSAGE。
1 或 JOptionPane.INFORMATION_MESSAGE。
JOptionPane.PLAIN_MESSAGE。
2 或 JOptionPane.WARNING_MESSAGE。
3 或 JOptionPane.QUESTION_MESSAGE。 -
默认情况下,messageType 的值是 JOptionPane.INFORMATION_MESSAGE。除类型 PLAIN_MESSAGE外,每种类型都有相应的图标,也可以通过 icon 参数提供自己的图标。
(3)输入对话框
- 输入对话框用于接收用户的输入。输入组件可以由文本框、下拉列表或者列表框进行实现。如果没有指定可选值,那么就使用文本框接收输入;如果指定了一组可选值,可选值的个数小于 20,那么将使用下拉列表显示;如果可选值的个数大于或等于 20,那么这些可选值将通过列表框显示。
创建输入对话框的方法如下:
public static String showInputDialog(Component parentComponent,Object message,String title,int messageType)
public static Object showInputDSalog(Component parentComponent,Object message,String title,int messageType,Icon icon,Object[] selectionValue,Object initValue)
- 其中,第一个 showInputDialog() 方法用于使用文本框输入,第二个 showInputDialog() 方法用于下拉列表或列表框的显示方式。参数 parentComponent 是必需的,message 默认为空,title 默认值为“输入”,messageType 的值默认为 3 或 JOptionPane.QUESTION_MESSAGE。
- 提示:showInputDialog() 方法中没有 optionType 参数,表示输入对话框的按钮是不可以设置的,通常显示“确定”和“取消”按钮。
(4)选项对话框
- 选项对话框允许用户自己定制按钮内容。创建选项对话框的方法如下:
public static int showOptionDialog(Component parentComponent,Object message,String title,int optionType,int messageType,icon icon,Object[] options,Object initValue)
- 其中,使用 options 参数指定按钮,initValue 参数用于指定默认获得焦点的按钮。该方法返回表明激活的按钮的一个整型值。
3.15、JTable(表格)
- 表格是 Swing 新增加的组件,主要功能是把数据以二维表格的形式显示出来,并且允许用户对表格中的数据进行编辑。表格组件是最复杂的组件之一,它的表格模型功能非常强大、灵活而易于执行。
- 构造器
JTable():构造一个默认的 JTable,使用默认的数据模型、默认的列模型和默认的选择模型对其进行初始化。
JTable(int numRows,int numColumns):使用 DefaultTableModel 构造具有 numRows 行和 numColumns 列个空单元格的 JTable。
JTable(Object[][] rowData,Object[] columnNames):构造一个 JTable 来显示二 维数组 rowData 中的值,其列名称为 columnNames。
- JTable常用方法:
3.16、JTree(树组件)
- Swing 使用 JTree 类实现树,它的主要功能是把数据按照树状进行显示,其数据来源于其他对象。
- JTree 树中最基本的对象叫作节点,表示在给定层次结构中的数据项。树以垂直方式显示数据,每行显示一个节点。
- 树中只有一个根节点,所有其他节点从这里引出。除根节点外,其他节点分为两类:一类是代子节点的分支节点,另一类是不带子节点的叶节点
- 构造器
JTree() 返回带有示例模型的 JTree
JTree(Object[] value) 返回 JTree,指定数组的每个元素作为不被显示的新根节点的子节点
JTree(TreeNode root) 返回 JTree,使用指定的 root 作为其根节点
JTree(TreeNode root,boolean aslcsAllowsChildren) 返回 JTree,使用指定的 root 作为其根节点,asksAllowsChildren 用
于确定节点是否为叶节点
-
树节点由 javax.swing.tree 包中的接口 TreeNode 定义,该接口被 DefaultMutableTreeNode 类实现。
-
为了创建一个树,使用 DefaultMutableTreeNode 类为树创建节点,它的两个常用的构造方法如下:
DefaultMutableTreeNode(Object userObject):创建没有父节点和子节点,但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。
DefaultMutableTreeNode(Object userObject,boolean allowsChildren):创建没有父节点和子节点的树节点,使用指定的用户对象对它进行初始化,仅在指定时才允许有子节点。
3.17、JTabbedPane(选项卡组件)
- 使用选项卡可以在有限的布局空间内展示更多的内容。
- JTabbedPane 类创建的选项卡可以通过单击标题或者图标在选项卡之间进行切换。JTabbedPane 类的常用构造方法如下所示:
JTabbedPane():创建一个具有默认 JTabbedPane.TOP 布局的空 TabbedPane。
JTabbedPane(int tabPlacement):创建一个空的 TabbedPane,使其具有以下指定选项卡布局中的一种:JTabbedPane.TOP、JTabbedPane.BOTTOM、JTabbedPane.LEFT 或 JTabbedPane.RIGHT。
- 创建了 JTabbedPane 实例之后,可使用 addTab() 方法和 insertTab() 方法将选项卡/组件添加到 TabbedPane 对象中。选项卡通过对应于添加位置的索引来表示,其中第一个选项卡的索引为 0,最后一个选项卡的索引为选项卡数量减 1。
- TabbedPane 使用 SingleSelectionModel 属性来表示选项卡索引集和当前所选择的索引。如果选项卡数量大于 0,则总会有一个被选定的索引,此索引默认被初始化为第一个选项卡;如果选项卡数量为 0,则所选择的索引为 -1。
- JTabbedPane类的常用方法:
四、事件监听
1、事件处理模型
若使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及三类对象。
-
Event(事件):用户对组件的一次操作称为一个事件,以类的形式出现。例如,键盘操作对应的事件类是 KeyEvent。
-
Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮 Button。
-
Event Handler(事件处理者):接收事件对象并对其进行处理的对象事件处理器,通常就是某个 Java 类中负责处理事件的成员方法。
-
图解如下:
由于同一个事件源上可能发生多种事件,因此,Java 采取了授权模型(Delegation Model),事件源可以把在其自身上所有可能发生的事件分别授权给不同的事件处理者来处理。例如,在 Panel 对象上既可能发生鼠标事件,也可能发生键盘事件,该 Panel 对象可以授权给事件处理者 a 来处理鼠标事件,同时授权给事件处理者 b 来处理键盘事件。
有时也将事件处理者称为监听器,主要原因在于监听器时刻监听事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件类型一致,就马上进行处理。授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。
事件处理者(监听器)通常是一个类,该类如果能够处理某种类型的事件,就必须实现与该事件类型相对的接口。例如,一个 ButtonHandler 类之所以能够处理 ActionEvent 事件,原因在于它实现了与 ActionEvent 事件对应的接口 ActionListener。每个事件类都有一个与之相对应的接口。
2、动作事件监听器(最常用)
动作事件监听器是 Swing 中比较常用的事件监听器,很多组件的动作都会使用它监听,像按钮被里击、列表框中选择一项等。与动作事件监听器有关的信息如下。
- 事件名称:ActionEvent。
- 事件监听接口: ActionListener。
- 事件相关方法:addActionListener() 添加监听,removeActionListener() 删除监听。
- 涉及事件源:JButton、JList、JTextField 等。
3、焦点事件监听器
除了单击事件外,焦点事件监听器在实际项目中应用也比较广泛,例如将光标离开文本框时弹出对话框,或者将焦点返回给文本框等,与焦点事件监听器有关的信息如下。
- 事件名称:FocusEvent。
- 事件监听接口: FocusListener。
- 事件相关方法:addFocusListener() 添加监听,removeFocusListener() 删除监听。
- 涉及事件源:Component 以及派生类。
FocusEvent 接口定义了两个方法,分别为 focusGained() 方法和 focusLost() 方法,其中 focusGained() 方法是在组件获得焦点时执行,focusLost() 方法是在组件失去焦点时执行。
3、监听列表项选择事件
列表框控件 JList 会显示很多项供用户选择,通常在使用时会根据用户选择的列表项完成不同的操作。