700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java图形化界面编程一

Java图形化界面编程一

时间:2022-01-29 10:42:07

相关推荐

Java图形化界面编程一

目录

一:介绍

二:AWT编程

2.1AWT介绍

2.2 AWT继承体系

2.3 Container容器

2.3.1 Container继承体系

2.3.2 常见API

2.3.3 容器演示

2.4 LayoutManager布局管理器

2.4.1 FlowLayout

2.4.2 BorderLayout

2.4.3 GridLayout

2.4.4 GridBagLayout

2.4.5 CardLayout

2.4.6 BoxLayout

2.5 AWT中常用组件

2.5.1 基本组件

2.5.2 对话框Dialog

一:介绍

java使用AWT和Swing相关的类可以完成图形化界面编程,其中AWT的全称是抽象窗口工具集(Abstract Window Toolkit),它是sun公司最早提供的GUI库,这个GUI库提供了一些基本功能,但这个GUI库的功能比较有限,所以后来sun公司又提供了Swing库。通过使用AWT和Swing提供的图形化界面组件库,java的图形化界面编程非常简单,程序只需要依次创建所需的图形组件,并以合适的方式将这些组件组织在一起,就可以开发出非常美观的用户界面。

二:AWT编程

2.1AWT介绍

当 JDK 1.0发布时, Sun 提供了 一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行 , 这套基本类库被称为"抽象窗口工具集 CAbstract Window Toolkit )",它为Java应用程序提供了基本的图形组件 。 AWT是窗口框架,它从不同平台的窗口系统中抽取出共同组件 , 当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台 。 简而言之 ,当使用 AWT 编写图形界面应用 时, 程序仅指定了界面组件的位置和行为,并未提供真正的实现,JVM调用操作系统本地的图形界面来创建和平台 一致的对等体 。

使用AWT创建的图形界面应用和所在的运行平台有相同的界面风格 , 比如在 Windows 操作系统上,它就表现出 Windows 风格 ; 在 UNIX 操作系统上,它就表现出UNIX 风格 。 Sun 希望采用这种方式来实现 " Write Once, Run Anywhere " 的目标 。

2.2 AWT继承体系

所有和 AWT 编程相关的类都放在 java.awt 包以及它的子包中, AWT 编程中有两个基类 :Component和 MenuComponent。

Component:代表一个能以图形化方式显示出来,并可与用户交互的对象,例如 Button 代表一个按钮,TextField 代表 一个文本框等;

MenuComponent:则代表图形界面的菜单组件,包括 MenuBar (菜单条)、 Menultem (菜单项)等子类。

其中 Container 是一种特殊的 Component,它代表一种容器,可以盛装普通的 Component。AWT中还有一个非常重要的接口叫LayoutManager ,如果一个容器中有多个组件,那么容器就需要使用LayoutManager来管理这些组件的布局方式。

2.3 Container容器

2.3.1 Container继承体系

Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;

Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使FlowLayout管理其内部组件布局;

ScrollPane 是 一个带滚动条的容器,它也不能独立存在,默认使用 BorderLayout 管理其内部组件布局;

2.3.2 常见API

2.3.3 容器演示

2.3.3.1 Window

测试:

import java.awt.*;public class WindowDemo {public static void main(String[] args) {//创建一个窗口Frame frame=new Frame("测试Windows窗口");//设置位置和大小frame.setLocation(500,300);frame.setSize(500,300);//或者//frame.setBounds(500,300,500,300);//设置可见frame.setVisible(true);}}

运行:

2.3.3.2 Panel

测试:

import java.awt.*;public class PanelDemo {public static void main(String[] args) {//1.创建一个Windows对象 因为pannel及其他容器都不能独立存在,需要依附window存在Frame frame=new Frame("测试Pannel");//2.创建Pannel对象Panel panel=new Panel();//3.创建一个文本框和一个按钮并把他们放入Pannel容器中panel.add(new TextField("这里是一个测试文本"));panel.add(new Button("这里是一个测试按钮"));//4.将pannel放入window中frame.add(panel);//5.设置window位置和大小frame.setBounds(500,300,500,300);//设置可见frame.setVisible(true);}}

运行:

由于IDEA默认使用utf-8进行编码,但是当前我们执行代码是是在windows系统上,而windows操作系统的默认编码是gbk,所以会乱码,如果出现了乱码,那么只需要在运行当前代码前,设置一个jvm参数 -Dfile.encoding=gbk即可。(后面不再强调)

再次运行

2.3.3.3 ScrollPane

测试:

import java.awt.*;public class ScrolPaneDemo {public static void main(String[] args) {Frame frame=new Frame("演示ScrollPane");//1.创建一个ScrollPane对象 SCROLLBARS_ALWAYS总是有滚动条ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);//2.创建一个文本框和一个按钮scrollPane.add(new TextField("这是一个测试文本"));scrollPane.add(new Button("这里是一个测试按钮"));//将scrollPanne放入window中frame.add(scrollPane);frame.setBounds(500,300,500,300);frame.setVisible(true);}}

运行:

程序明明向 ScrollPane 容器中添加了 一个文本框和一个按钮,但只能看到 一个按钮,却看不到文本框 ,这是为什么 呢?这是因为ScrollPane 使用 BorderLayout 布局管理器的缘故,而 BorderLayout 导致了该容器中只有一个组件被显示出来 。

2.4 LayoutManager布局管理器

之前,我们介绍了Component中有一个方法 setBounds() 可以设置当前容器的位置和大小,但是我们需要明确一件事,如果我们手动的为组件设置位置和大小的话,就会造成程序的不通用性。

如果要让我么的程序在不同的操作系统下,都有相同的使用体验,那么手动设置组件的位置和大小,无疑是一种灾难,因为有太多的组件,需要分别设置不同操作系统下的大小和位置。为了解决这个问题,Java提供了LayoutManager布局管理器,可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置了,只需要为容器选择合适的布局管理器即可。

2.4.1 FlowLayout

在 FlowLayout 布局管理器 中,组件像水流一样向某方向流动 (排列) ,遇到障碍(边界)就折回,重头开始排列 。在默认情况下, FlowLayout 布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。

测试:

import java.awt.*;public class FlowLayoutDemo {public static void main(String[] args) {Frame frame=new Frame("演示Flowlayout");//1.通过setLayout方法设置容器的布局管理器frame.setLayout(new FlowLayout(FlowLayout.CENTER,20,30));//2.添加多个按钮到frame中for (int i = 1; i <=50; i++) {frame.add(new Button("按钮"+i));}//3.设置最佳大小,用pack()方法frame.pack();frame.setVisible(true);}}

运行:

2.4.2 BorderLayout

BorderLayout 将容器分为 EAST、SOUTH、WEST 、NORTH 、CENTER五个区域,普通组件可以被放置在这 5 个区域的任意一个中 。 BorderLayout布局 管理器的布局示意图如图所示 。

当改变使用 BorderLayout 的容器大小时, NORTH 、 SOUTH 和 CENTER区域水平调整,而 EAST 、 WEST 和 CENTER 区域垂直调整。使用BorderLayout 有如下两个注意点:

当向使用 BorderLayout 布局管理器的容器中添加组件时 , 需要指定要添加到哪个区域中 。 如果没有指定添加到哪个区域中,则默认添加到中间区域中;

如果向同一个区域中添加多个组件时 , 后放入的组件会覆盖先放入的组件;

如果不往某个区域中放入组件,那么该区域不会空白出来,而是会被其他区域占用

测试1:

import java.awt.*;public class BorderLayoutDemo1 {public static void main(String[] args) {Frame frame=new Frame("演示BorderLayout");//1.通过setLayout方法设置容器的布局管理器//其实不设置也可以,window默认使用BorderLayout管理其内部组件布局frame.setLayout(new BorderLayout(30,10));//2.往frame指定区域添加组件frame.add(new Button("北侧按钮"),BorderLayout.NORTH);frame.add(new Button("南侧按钮"),BorderLayout.SOUTH);frame.add(new Button("西侧按钮"),BorderLayout.WEST);frame.add(new Button("东侧按钮"),BorderLayout.EAST);frame.add(new Button("中间按钮"),BorderLayout.CENTER);//3.设置最佳大小,用pack()方法frame.pack();frame.setVisible(true);}}

运行:

测试2:

import java.awt.*;public class BorderLayoutDemo2 {public static void main(String[] args) {//1.创建Frame对象Frame frame = new Frame("这里测试BorderLayout");//2.指定Frame对象的布局管理器为BorderLayoutframe.setLayout(new BorderLayout(30,5));//3.往Frame指定南,北,放入一个按钮,往中间区域放入一个Panelframe.add(new Button("南侧按钮"), BorderLayout.SOUTH);frame.add(new Button("北侧按钮"), BorderLayout.NORTH);Panel panel = new Panel();panel.add(new TextField("测试文本"));panel.add(new Button("中间按钮"));frame.add(panel, BorderLayout.CENTER);//4.设置Frame为最佳大小frame.pack();//5.设置Frame可见frame.setVisible(true);}}

运行:

2.4.3 GridLayout

GridLayout 布局管理器将容器分割成纵横线分隔的网格 , 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时, 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLayout不同的是,放置在 GridLayout 布局管理器中的各组件的大小由组件所处的区域决定(每 个组件将自动占满整个区域) 。

测试

import java.awt.*;public class GridLayoutDemo {public static void main(String[] args) {Frame frame=new Frame("计算器");//1.创建一个Pannel对象,里面存放一个TextFiled组件//30表示最多能容纳30个字符Panel p1 = new Panel();p1.add(new TextField(30));//2.把当前这个Panel添加到frame的北边区域frame.add(p1,BorderLayout.NORTH);//3,创建一个Pannel对象,并设置它的布局管理器为GridLayout//Pannel 默认的布局管理器是FlowLayout//GridLayout(int rows,int cols,int hgap,int vgap)Panel p2=new Panel();p2.setLayout(new GridLayout(3,5,4,4));//4.往Pannel中添加内容for (int i = 0; i < 10; i++) {//Button(字符串) i+""即变为字符串类型p2.add(new Button(i+""));}p2.add(new Button("+"));p2.add(new Button("-"));p2.add(new Button("*"));p2.add(new Button("/"));p2.add(new Button("."));//5.将Pannel添加到frame中frame.add(p2);frame.pack();frame.setVisible(true);}}

运行:

2.4.4 GridBagLayout

GridBagLayout 布局管理器的功能最强大 , 但也最复杂,与 GridLayout 布局管理器不同的是, 在GridBagLayout 布局管理器中,一个组件可以跨越一个或多个网格 , 并可以设置各网格的大小互不相同,从而增加了布局的灵活性 。 当窗口的大小发生变化时 , GridBagLayout 布局管理器也可以准确地控制窗口各部分的拉伸 。(不好用,Swing中的布局管理器更好用,下面不做测试)

由于在GridBagLayout 布局中,每个组件可以占用多个网格,此时,我们往容器中添加组件的时候,就需要具体的控制每个组件占用多少个网格,java提供的GridBagConstaints类,与特定的组件绑定,可以完成具体大小和跨越性的设置。GridBagConstraints API不做演示

2.4.5 CardLayout

CardLayout 布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面的那个 Component 才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌才可见。

测试:

import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class CardLayoutDemo {public static void main(String[] args) {Frame frame = new Frame("这里测试CardLayout");//1.创建一个Pannel,用来存储多张卡片Panel p1 = new Panel();//2.创建CardLayout对象,并且把该对象设置给之前创建的容器CardLayout cardLayout = new CardLayout();p1.setLayout(cardLayout);//3.往Pannel中存储多个组件String[] names = {"第一页", "第二页", "第三页", "第四页", "第五页"};for (int i = 0; i < 5; i++) {p1.add(names[i], new Button(names[i]));}//4.把Pannel放到frame的中间区域//或者frame.add(p1,BorderLayout.CENTER);frame.add(p1);//5.创建另一个Pannel p2用来存储多个按钮组件Panel p2 = new Panel();//6.创建5个按钮组件Button b1 = new Button("上一张");Button b2 = new Button("下一张");Button b3 = new Button("第一张");Button b4 = new Button("最后一张");Button b5 = new Button("第三张");//7.创建一个事件监听器,监听按钮的点击动作ActionListener listener = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//这个字符串其实就是按钮上的文字String actionCommand = e.getActionCommand();switch (actionCommand) {case "上一张":cardLayout.previous(p1);break;case "下一张":cardLayout.next(p1);break;case "第一张":cardLayout.first(p1);break;case "最后一张":cardLayout.last(p1);break;case "第三张":cardLayout.show(p1, "第三张");break;}}};//8.把当前这个事件监听器和多个按钮绑定在一起b1.addActionListener(listener);b2.addActionListener(listener);b3.addActionListener(listener);b4.addActionListener(listener);b5.addActionListener(listener);//9.把按钮添加到容器p2中p2.add(b1);p2.add(b2);p2.add(b3);p2.add(b4);p2.add(b5);//10.把p2放在frame的南边区域frame.add(p2,BorderLayout.SOUTH);frame.pack();frame.setVisible(true);}}

运行:

2.4.6 BoxLayout

为了简化开发,Swing 引入了 一个新的布局管理器 : BoxLayout 。 BoxLayout 可以在垂直和 水平两个方向上摆放 GUI 组件, BoxLayout 提供了如下一个简单的构造器:

测试1:

package layout;import javax.swing.*;import java.awt.*;public class BoxLayoutDemo1 {public static void main(String[] args) {Frame frame=new Frame("这里测试BoxLayout");//1.基于frame创建一个BoyLayout对象 并且该对象存放组件是垂直存放BoxLayout boxLayout = new BoxLayout(frame,BoxLayout.Y_AXIS);//2.把BoyLayout对象设置给Frameframe.setLayout(boxLayout);//3.往frame中添加两个按钮组件frame.add(new Button("按钮1"));frame.add(new Button("按钮2"));frame.pack();frame.setVisible(true);}}

运行:

在java.swing包中,提供了一个新的容器Box,该容器的默认布局管理器就是BoxLayout,大多数情况下,使用Box容器去容纳多个GUI组件,然后再把Box容器作为一个组件,添加到其他的容器中,从而形成整体窗口布局。

测试2:

import javax.swing.*;import java.awt.*;public class BoxLayoutDemo2 {public static void main(String[] args) {//1.创建Frame对象Frame frame = new Frame("这里测试BoxLayout");//2.创建一个横向的Box,并添加两个按钮Box hBox = Box.createHorizontalBox();hBox.add(new Button("水平按钮一"));hBox.add(new Button("水平按钮二"));//3.创建一个纵向的Box,并添加两个按钮Box vBox = Box.createVerticalBox();vBox.add(new Button("垂直按钮一"));vBox.add(new Button("垂直按钮二"));//4.把box容器添加到frame容器中frame.add(hBox,BorderLayout.NORTH);frame.add(vBox);//5.设置frame最佳大小并可见frame.pack();frame.setVisible(true);}}

运行:

通过之前的两个BoxLayout演示,我们会发现,被它管理的容器中的组件之间是没有间隔的,不是特别的美观,但之前学习的几种布局,组件之间都会有一些间距,那使用BoxLayout如何给组件设置间距呢?

其实很简单,我们只需要在原有的组件需要间隔的地方,添加间隔即可,而每个间隔可以是一个组件,只不过该组件没有内容,仅仅起到一种分隔的作用。

Box类中,提供了5个方便的静态方法来生成这些间隔组件:

测试:

import javax.swing.*;import java.awt.*;public class BoxLayoutDemo3 {public static void main(String[] args) {Frame frame = new Frame("这里测试BoxLayout");//1.创建水平排列的Box容器 hBoxBox hBox = Box.createHorizontalBox();//2.往Box容器中添加按钮,还需要在多个按钮之间添加分割hBox.add(new Button("水平按钮一"));hBox.add(Box.createHorizontalGlue());//水平Glue该分割在两个方向都可以拉伸hBox.add(new Button("水平按钮二"));hBox.add(Box.createHorizontalStrut(30));hBox.add(new Button("水平按钮三"));//3.创建垂直排列的Box容器 vBoxBox vBox = Box.createVerticalBox();//4.往vBox容器中添加按钮,还需要在多个按钮之间添加分割vBox.add(new Button("垂直按钮一"));vBox.add(Box.createVerticalGlue());//垂直Glue()该分割在两个方向上都可以拉伸vBox.add(new Button("垂直按钮二"));vBox.add(Box.createVerticalStrut(30));vBox.add(new Button("垂直按钮三"));//5.把box容器添加到frame中frame.add(hBox,BorderLayout.NORTH);frame.add(vBox);frame.pack();frame.setVisible(true);}}

运行

2.5 AWT中常用组件

2.5.1 基本组件

这些 AWT 组件的用法比较简单,可以查阅 API 文档来获取它们各自的构方法、成员方法等详细信息。

测试:

import javax.swing.*;import java.awt.*;public class BasicComponentDemo {Frame frame = new Frame("这里测试基本组件");//定义一个5行,20列的多行文本域TextArea ta = new TextArea(5, 20);//定义一个下拉选择框Choice colorChooser = new Choice();//定义一个复选框组CheckboxGroup cbg = new CheckboxGroup();//定义一个单选框,初始处于被选中状态,并添加到cbg组中Checkbox male = new Checkbox("男", cbg, true);//定义一个单选框,初始处于未被选中状态,并添加到cbg组中Checkbox female = new Checkbox("女", cbg, false);//定义一个复选框,初始处于未被选中状态Checkbox married = new Checkbox("是否已婚?", false);//定义一个50列的单行文本域TextField tf = new TextField(50);//定义一个按钮Button ok = new Button("确认");//定义一个列表选择框 true代表可以多选List colorList = new List(6,true);public void init() {//创建一个垂直排列的Box容器,装载 多行文本域和checkPanelBox topLeft = Box.createVerticalBox();topLeft.add(ta);//往列表选择框中添加内容colorList.add("红色");colorList.add("绿色");colorList.add("蓝色");//创建一个水平排列的Box容器,装载topLeft和列表选择框Box top = Box.createHorizontalBox();top.add(topLeft);top.add(colorList);//将top添加到frame的中间区域frame.add(top);//往下拉选择框中添加内容colorChooser.add("红色");colorChooser.add("绿色");colorChooser.add("蓝色");//创建一个装载按钮和文本框的Panel容器//创建一个Panel容器,装载下拉选择框,单选框和复选框Panel checkPanel = new Panel();checkPanel.add(colorChooser);checkPanel.add(male);checkPanel.add(female);checkPanel.add(married);topLeft.add(checkPanel);Panel bottom = new Panel();bottom.add(tf);bottom.add(ok);//把bottom添加到Frame的底部frame.add(bottom,BorderLayout.SOUTH);//设置frame最佳大小并可见frame.pack();frame.setVisible(true);}public static void main(String[] args) {new BasicComponentDemo().init();}}

运行:

2.5.2 对话框Dialog

2.5.2.1 Dialog

Dialog 是 Window 类的子类,是 一个容器类,属于特殊组件 。 对话框是可以独立存在的顶级窗口, 因此用法与普通窗口的用法几乎完全一样,但是使用对话框需要注意下面两点:

对话框通常依赖于其他窗口,就是通常需要有一个父窗口;

对话框有非模式(non-modal)和模式(modal)两种,当某个模式对话框被打开后,该模式对话框总是位于它的父窗口之上,在模式对话框被关闭之前,父窗口无法获得焦点。

测试:

import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class DialogDemo1 {public static void main(String[] args) {Frame frame = new Frame("这里测试Dialog");Dialog d1 = new Dialog(frame, "模式对话框", true);Dialog d2 = new Dialog(frame, "非模式对话框", false);Button b1 = new Button("打开模式对话框");Button b2 = new Button("打开非模式对话框");//设置对话框的大小和位置d1.setBounds(20,30,300,400);d2.setBounds(20,30,300,400);//给b1和b2绑定监听事件b1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {d1.setVisible(true);}});b2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {d2.setVisible(true);}});//把按钮添加到frame中frame.add(b1);frame.add(b2,BorderLayout.SOUTH);//设置frame最佳大小并可见frame.pack();frame.setVisible(true);}}

运行:

测试2:

import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class DialogDemo2 {public static void main(String[] args) {Frame frame = new Frame("这里测试Dialog");Button b1 = new Button("打开模式对话框");Dialog d1 = new Dialog(frame, "模式对话框", true);//往对话框中添加内容Box vBox = Box.createVerticalBox();vBox.add(new TextField(15));vBox.add(new JButton("确认"));d1.add(vBox);//设置对话框的大小和位置d1.setBounds(20,30,300,100);//给b1绑定监听事件b1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {d1.setVisible(true);}});//把按钮添加到frame中frame.add(b1);//设置frame最佳大小并可见frame.pack();frame.setVisible(true);}}

运行:

2.5.2.1 FileDialog

Dialog 类还有 一个子类 : FileDialog ,它代表一个文件对话框,用于打开或者保存 文件,需要注意的是FileDialog无法指定模态或者非模态,这是因为 FileDialog 依赖于运行平台的实现,如果运行平台的文件对话框是模态的,那么 FileDialog 也是模态的;否则就是非模态的 。

测试:

import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class FileDialogTest {public static void main(String[] args) {Frame frame = new Frame("这里测试FileDialog");Button b1 = new Button("打开文件");Button b2 = new Button("保存文件");FileDialog d1 = new FileDialog(frame, "选择需要加载的文件", FileDialog.LOAD);FileDialog d2 = new FileDialog(frame, "选择需要保存的文件", FileDialog.SAVE);//给按钮添加事件b1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {d1.setVisible(true);//打印用户选择的文件路径和名称System.out.println("用户选择的文件路径:"+d1.getDirectory());System.out.println("用户选择的文件名称:"+d1.getFile());}});System.out.println("-------------------------------");b2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {d2.setVisible(true);//打印用户选择的文件路径和名称System.out.println("用户选择的文件路径:"+d2.getDirectory());System.out.println("用户选择的文件名称:"+d2.getFile());}});//添加按钮到frame中frame.add(b1);frame.add(b2,BorderLayout.SOUTH);//设置frame最佳大小并可见frame.pack();frame.setVisible(true);}}

运行:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。