Java基础知识每日总结(14)---Java图形程序设计

图形程序设计

1.简介
在Java刚刚出现的时候,包含了一个用于基本GUI(图形用户界面)程序设计的类库,它被称为抽象窗口工具包(AWT)。AWT中很多控件都是重量级,即和底层操作系统的关联很大。后来,基于AWT的架构之上出现了Swing,它提供了能力更加强大的用户界面组件且完全由Java实现,增强了可移植性,属于轻量级控件。

所以,在Java中与GUI(图形用户界面)有关的类都放在java.awt包和javax.swing包下,包名为javax表示这是一个Java的扩展包而不是核心包。
GUI的继承体系图:
在这里插入图片描述
左边属于容器组件,右边属于基本组件,基本组件需要依赖容器组件而存在。因为java.awt包内的绝大多数方法已过时所以以下展示javax.swing的知识。

2.创建框架
Swing中的控件都需要放置到窗体中才能显示和使用,常见的窗体有JFrame、JDialog和JApplet。
在Java中,顶层窗口(就是没有包含在其他窗口中的窗口)被称为框架(frame)。在AWT库中有一个Frame类,用来描述顶层窗口。这个类的Swing版本叫做JFrame,它继承自Frame类。将Swing和AWT组件混在一起使用将会导致视觉和行为的不一致。
因为Swing不是线程安全的,所以所有的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。这个线程保持程序处于激活状态,直到关闭框架或调用System.exit方法终止程序。下面的代码片段是事件分派线程中的执行代码:

EventQueue.invokeLater(() -> {
  代码片段
});

简单地构造框架是不会自动地显示出来的,框架起初是不可见的,为了显示框架,main方法需要调用Window类的public void setVisible(boolean b) 方法;public void setSize(int width, int height) 方法用来设置窗体的宽和高,宽高的默认单位是像素,以屏幕 左上角为0点计算宽和高;可以通过public void setLocation(int x, int y) 方法设置窗体 左上角的坐标。例,

import java.awt.EventQueue;

import javax.swing.JFrame;

public class JFrameTest {
	public static void main(String[] args) {
		EventQueue.invokeLater(() -> {
			SimpleFrame frame = new SimpleFrame();
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setVisible(true);
		});
	}

}

class SimpleFrame extends JFrame {
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;

	public SimpleFrame() {
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
	}
}

程序运行结果:
在这里插入图片描述
可以通过JFrame类的构造方法public JFrame(String title) 或它的父类Frame的public void setTitle(String title) 方法设置窗体的标题。可以用Frame的父类Window类的public void setBounds(int x, int y, int width, int height) 方法取代setSize和setLocation两个方法,此方法的前两个参数是setLocation的参数,后两个参数是setSize的参数。

此图中看到的标题栏和外框装饰都是由操作系统绘制的,而不是Swing库。可以调用frame.setUndecorated(true);关闭所有框架装饰。运行结果:
在这里插入图片描述
创建窗体时注意:

  • 窗体默认是不可见的,需要使用setVisible()方法将其设置成可见
  • 窗体默认是没有大小的,需要使用setBounds()方法设置显示位置和大小
  • 窗体默认是不能关闭的,需要使用setDefaultCloseOperation()方法修改这个属性
  • 修改默认的外观,使用setLookAndFeel()方法将窗体设置成需要的外观。此时会影响到容器中所有控件的默认外观
  • 为窗体增加标题,使用setTitle()方法可以将指定的字符串设置成窗体标题
  • 修改窗体的图标,上面创建的窗体左上角使用的是Java图标,可以使用setIconImages()方法将其修改成自己喜欢的图标
  • 创建的窗体能够支持最大化和最小化,这两个功能不需要编程完成

当单击关闭按钮时,可以设置窗体如何响应这个操作,这些操作都定义在WindowConstants接口中:
在这里插入图片描述
3.Swing常用布局管理器
在Swing中增加控件时,需要考虑控件的位置和大小。Java提供了一些布局管理器,它们可以将控件进行统一的管理,这样就不需要考虑控件是否会重叠等问题。
①绝对布局(Absolute Layout)
Swing中窗体具有默认布局管理器,例如JFrame使用的是边界布局。虽然布局管理器能够简化程序的开发,但是为了获得最大的灵活性,可以使用绝对布局,即不使用任何布局管理器。使用步骤:

  • 使用Container.setLayout(null)方式取消布局管理器
  • 使用Component.setBounds()方法来设置每个控件的大小与位置

②流式布局管理器(FlowLayout)
流式布局是面板的默认布局,它用于安排有向流中的控件,这非常类似于段落中的文本行。流的方向取决于容器的componentOrientation属性,它可能是以下两个值中的一个:

  • ComponentOrientation.LEFT_TO_RIGHT:顺序是从左向右(默认)
  • ComponentOrientation.RIGHT_TO_LEFT:顺序是从右向左

流布局一般用来安排面板中的按钮或者标签和文本框。它使得按钮呈水平放置,直到同一条线上再也没有适合的按钮。线的对齐方式由align属性确定:
在这里插入图片描述
③边界布局管理器(BorderLayout)
边界布局是窗体的默认布局,它将窗体分成了5部分:东、西、南、北和中。通过使用不同的参数将控件放置在不同的位置:
在这里插入图片描述
④网格布局管理器(GridLayout)
网格布局将窗体划分成一个表格,可以在创建网格布局管理器的时候指定表格的行和列。默认情况下,是按照从左到右、从上到下组织增加到窗体中的控件。而且每一个控件都会填充整个单元格,即使改变窗体的大小,控件也会随之而改变大小。
⑤网格组布局管理器(GridBagLayout)
由GridBagLayout实现的布局管理器称为网格组布局管理器,它实现了一个动态的矩形网格,该矩形网格由无数个矩形单元格组成,每个控件可以占用一个或多个这样的单元格。所谓动态的矩形网格,即可以根据实际需要随意增减矩形网格的行数和列数。
在向由GridBagLayout类管理的窗体中添加控件时,需要为每个控件创建一个与之关联的GridBagConstraints类的对象,通过该类中的属性可以设置控件的布局信息。
通过GridBagLayout实现的矩形网格的绘制方向由窗体决定,如果窗体的方向是从左到右,则位于矩形网格左上角的单元格的列索引为0,此时控件左上角的点为起始点;如果窗体的方向是从右到左,则位于矩形网格右上角的单元格的列索引为0,此时控件右上角的点为起始点。

gridx和gridy属性:
这两个属性用来设置控件起始点所在单元格的索引值。属性gridx设置的是X轴(即网格水平方向)的索引值,属性gridy设置的是Y轴(即网格垂直方向)的索引值。
gridwidth和gridheight属性:
这两个属性用来设置控件占用网格组的行数和列数。属性gridwidth为控件占用网格组的列数,属性gridheight为控件占用网格组的行数。
anchor属性:
属性anchor用来设置控件在其所在显示区域的显示位置。通常将显示区域从方向上划分为9个方位,分别为北方(NORTH)、东北(NORTHEAST)、东方(EAST)、东南(SOUTHEAST)、南方(SOUTH)、西南(SOUTHWEST)、西方(WEST)、西北(NORTHWEST)和中心(CENTER),代表9个方位的单词也是该类中的静态常量,可以利用9个静态常量设置anchor属性,其中静态常量CENTER为默认位置。
fill属性:
属性fill用来设置控件的填充方式。利用4个静态常量设置该属性,默认情况下是将该属性设置为静态常量NONE,即不调整控件大小至填满显示区域;如果将该属性设置为静态常量HORIZONTAL,表示只调整控件水平方向的大小(即控件宽度)至填满显示区域;如果将该属性设置为静态常量VERTICAL,表示只调整控件垂直方向的大小(即控件高度)至填满显示区域;如果将该属性设置为静态常量BOTH,则表示同时调整控件的宽度和高度至填满显示区域。示例图:
在这里插入图片描述
insets属性:
insets属性用来设置控件四周与单元格边缘之间的最小距离。该属性的类型为Insets,Insets类仅有一个构造方法Insets(int top, int left, int bottom, int right),它的4个入口参数依次为控件上方、左侧、下方和右侧的最小距离,单位为像素,默认为没有距离。示例图:
在这里插入图片描述
ipadx和ipady属性:
ipadx和ipady属性用来修改控件的首选大小。属性ipadx用来修改控件的宽度,属性ipady用来修改控件的高度。如果为正数,则在首选大小的基础上增加指定的宽度和高度,如果为负数,则在首选大小的基础上减小指定的宽度和高度。
weightx和weighty属性:
weightx和weighty属性用来设置网格组的每一行和每一列对额外空间的分布方式。在不设置属性weightx和weighty(即采用默认设置)的情况下,当窗体调整到足够大时,将出现控件全部聚集在窗体的中央,在控件四周出现了大片的额外空间的效果。为了避免这种情况出现,可以通过这两个属性设置网格组的每一行和每一列对额外空间的分布方式。
weightx和weighty属性的默认值均为0,表示不分布窗体的额外空间。属性weightx用来设置其所在列对额外空间的分布方式,如果在该列中设置了多个weightx属性,则取它们的最大值为该列的分布方式;属性weighty用来设置其所在行对额外空间的分布方式,如果在该行中设置了多个weighty属性,则取它们的最大值为该行的分布方式。
在设置网格组的每一行和每一列对额外空间的分布方式时,建议为各个属性按百分比取值。
网格组的行和列对额外空间的分布方式完全相同,下面以网格组的行为例详细讲解对额外空间的分布方式。网格组布局管理器首先计算出每一行的分布方式,即获取每一行的weighty属性的最大值;然后再计算每个最大值占所有最大值总和的百分比;最后将额外空间的相应百分比分配给对应行。

4.Swing常用控件
在这里插入图片描述
①面板
面板也是一个Swing容器,面板可以作为容器容纳其他控件,但面板必须添加到其他容器中才能发挥作用,例如添加到窗体控件容器。Swing中常用的面板包括JPanel面板以及JScrollPane面板。
JPanel面板:
JPanel面板可以聚集一些控件进行布局,它继承自java.awt.Container类。
JPanel控件作为容器类,除了可以添加控件之外,也可以设置布局管理器,将面板中的控件布局,面板默认使用流式布局。
JScrollPane面板:
在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容,这时可以使用JScrollPane面板,JScrollPane面板是带滚动条的面板,JScrollPane也是一种容器,但是JScrollPane常用于布置单个控件,并且不可以使用布局管理器,如果需要在JScrollPane面板中放置多个控件,需要将多个控件放置在JPanel面板上,然后将JPanel面板作为一个整体控件添加在JScrollPane控件上。
②标签控件与图标
在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。标签由JLabel类定义,父类为JComponent类。标签可以显示一行只读文本,一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单地显示文本和图片,但是可以使用标签的特性指定标签上文本的对齐方式。
JLabel类提供了多种构造方法,可以创建多种标签,常用的几个构造方法如下:
在这里插入图片描述
Swing中的图标可以放置在按钮、标签等控件上,用于描述控件的用途,图标可以由Java支持的图片文件类型进行创建也可以使用java.awt.Graphics类提供的功能方法来绘制。
Swing中的图标除了可以绘制之外,还可以使用某个特定的图片创建图标,利用javax.swing.ImageIcon类可以根据现有图片创建图标,ImageIcon类实现了Icon接口,同时Java支持多种图片格式。ImageIcon类的常用构造方法如下:
在这里插入图片描述
③按钮控件
按钮在Swing控件中是较为常见的控件,它用于触发特定动作,Swing中提供很多种按钮,包括提交按钮、复选框、单选按钮等,这些按钮都是从AbstractButton类中继承而来。
普通按钮控件(JButton):
JButton是Swing的按钮控件类,它和JLabel控件都是常用的控件类。可以使用JButton创建普通样式的按钮。例如“确定”“取消”等。JButton类的常用构造方法如下:
在这里插入图片描述
单选按钮控件(JRadioButton):
JRadioButton也是一种按钮,它用于创建界面中的单选按钮。单选按钮有选中与未选中状态,另外它也有和JButton类似的构造方法:
在这里插入图片描述
单选按钮的组合使用,需要使用ButtonGroup类将按钮分组,该类使用默认构造方法创建,通过add()方法将按钮添加到按钮组中。组合起来的多个单选按钮添加到按钮组以后,同一时间只能有一个单选按钮被选中,即选择一个单选按钮之后,另外一个已经处于被选择状态的单选按钮将取消选择状态。如果没有指定按钮组,那么多个单选按钮之间互不影响,可以同时选中多个单选按钮,这样即和复选框就没有多大区别。
复选按钮控件(JCheckBox):
复选按钮在Swing控件中使用也非常广泛,每一个复选按钮都提供“选中”与“未选中”的两种状态,它与单选按钮唯一不同的是选择状态的图标一个是圆形,一个是方形,其他的使用方法完全一样。另外,JCheckBox控件不需要设置按钮组,否则,同一时间只能选择一个复选按钮,即成了单选按钮。
④文本控件
一个应用程序所有输入功能的界面几乎都是由文本控件接收用户输入。
文本框控件(JTextField):
文本框用来显示或编辑一个单行文本,在Swing中通过javax.swing.JTextField类创建文本框控件对象,常用的构造方法如下:
在这里插入图片描述
定义JTextField控件很简单,可以在初始化文本框时设置文本框的默认文字、文本框的首选列数等。其中首选列数columns用于定制控件在布局管理器中的首选大小,如果将文本框使用绝对布局或者布局在限制控件大小的布局管理器中,例如GridLayout,Columns将不起作用。
密码框控件(JPasswordField):
密码框与文本框的定义与用法基本相同,唯一不同的是密码框控件将用户输入的字符串以某种字符显示,例如“*”字符,这样可以隐藏用户输入的密码,防止被其他人看见。密码框是通过javax.swing.JPasswordField类来创建,JPasswordField类的构造方法与JTextField类的构造方法非常相似,常用的构造方法:
在这里插入图片描述
使用setEchoChar()方法,可以改变密码框的回显字符。
文本域控件(JTextArea):
文本域控件的创建也非常简单。它在程序中用于接受用户的多行文字输入,例如记事本的文本编辑部分就是一个文本域控件,Swing中的文本区域控件是JTextArea类的实例对象,该类常用的构造方法如下:
在这里插入图片描述
在JTextArea类中存在一个setLineWrap()方法,该方法用于设置文本域是否可以自动换行,如果将该方法的参数设置为true,文本域将自动换行,相反则不自动换行,文本内容会溢出程序界面,也可以使用滚动面板管理文本域,在文本溢出程序界面,即文本长度超出文本域控件长度时,会出现滚动条。
⑤列表控件
Swing中提供两种列表控件,分别为下拉列表框JComboBox与列表框JList,下拉列表与列表框都带有一系列项目的控件,同时用户可以选择需要的项目。
下拉组合框控件(JComboBox):
下拉列表框是一个带条状的显示区,它具有下拉功能,在下拉列表框的右方存在一个倒三角形的按钮图标,当用户单击该图标,下拉列表中的项目将会以列表形式显示出来。Swing中的下拉列表框使用JComboBox类来创建,它是javax.swing.JComponent类的子类。常用构造方法如下:
在这里插入图片描述
在开发程序中,一般将下拉列表中的项目封装为ComboBoxModel类型的情况比较多,ComboBoxModel为接口,它代表一般模型,可以自定义一个类实现该接口,然后在初始化JComboBox对象时向上转型为ComboBoxModel接口类型,但是必须实现public void setSelectedItem (Object item)public Object getSelectedItem()两个方法。其中setSelectedItem()方法是设置下拉列表的选择项,getSelectedItem()方法用于返回下拉列表中选择的项。
我们自定义的用来实现ComboBoxModel接口的类除了实现该接口之外,还可以继承AbstractListModel类,在该类中也有3个操作下拉列表的重要方法:getSize():返回列表的长度 getElementAt (int index):返回指定索引处的值 addItem (Object anObject):为下拉组合框添加选项,anObject可以是字符串
列表框控件(JList):
列表框与下拉列表框的区别不仅仅表现在外观上,当激活下拉列表框时,会出现下拉列表框中的内容,但列表框只是在窗体上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放入滚动面板中。当用户在选择列表框中的某一项时,按住Shift键并选择列表框中的其他项目,可以连续选择两个选项直接的所有项目,也可以按住Ctrl键选择零散的个别项目。Swing中使用JList类对象来表示列表,常用的构造方法如下:
在这里插入图片描述
可以在初始化列表框后使用setListData()方法对列表框元素进行设置。同时也可以在初始化的过程中对列表框中的项目进行设置。设置的方式有3种类型,包括数组、Vector对象和ListModel模型。
⑥进度条
利用JProgressBar类可以实现一个进度条,它只不过是一个矩形控件,通过填充它的部分或全部来指示一个任务的执行情况,创建进度条的常用构造方法如下:
在这里插入图片描述
为了让进度条有更好的响应效果,可以将其放置在一个新线程中运行。

5.框架定位
JFrame类自身包含或从父类继承的用于处理框架大小和位置的某些重要方法:

  • setLocation和setBounds方法用于设置框架的位置
  • setIconImage用于告诉窗口系统在标题栏、任务切换窗口等位置显示哪个图标
  • setTitle用于改变标题栏的文字
  • setResizable利用一个boolean值确定框架的大小是否允许用户改变。

JFrame类的继承层次:
在这里插入图片描述
在Component类中的setLocation方法是重定位组件的一个方法。例,setLocation(x.y)将窗口放置在左上角水平x像素,垂直y像素的位置,坐标(0,0)位于屏幕的左上角。这个类中的setBounds方法可以实现一步重定位组件大小和位置。例,setBounds(int x,int y,int width,int height)

组件类的很多方法是以获取/设置方法对形式出现的,如getName和setName,这样的一个获取/设置方法对被称为一种属性。属性包含属性名和类型。对于get/set约定有一个例外:对于类型为boolean的属性,获取方法以is开头。
如果没有明确指定框架的大小,所有框架的默认值为0×0像素。
方法来源:

  • java.awt.Component
  • java.awt.Window
  • java.awt.Frame
  • java.awt.Toolkit
  • javax.swing. ImageIcon

6.在组件中显示信息
在Java中,框架被设置为放置组件的容器,可以将菜单栏和其他的用户界面元素放置在其中。下图为JFrame的结构:
在这里插入图片描述
在设计框架的时候要使用下列的代码将所有的组件添加到内容窗格中:

Container con1=frame.getContentPane();
Component c=...;
con1.add(c);

绘制一个组件需要定义一个扩展JComponent的类,并覆盖其中的paintComponent方法。paintComponent方法有一个Graphics类型的参数,这个参数保存着用于绘制图像和文本的设置,在Java中,所有的绘制必须使用Graphics对象,其中包含了绘制图案、图像和文本的方法,此对象的度量单位是像素。
显示文本是一种特殊的绘图。
JPanel是一个可以包含其他组件的容器,但也可以在其上面进行绘制。它与JComponent的不同之处在于面板不透明。
方法来源:

  • javax.swing.JFrame
  • java.awt.Component
  • javax.swing.JComponent
  • java.awt.Window

7.处理2D图形
Java有一个Java 2D库,它可以绘制图形,使用需要获得一个Graphics2D类对象。这个类是Graphics类的子类。paintComponent方法会自动获取一个Graphics类对象,只需要将它转化为Graphics2D类对象即可使用。
要想绘制图形,首先需要创建一个实现了Shape接口的类的对象,然后调用Graphics2D类中的draw方法。
方法来源:

  • java.awt.geom.RectangularShape
  • java.awt.geom.Rectangle2D
  • java.awt.geom.Ellipse2D
  • java.awt.geom.Point2D
  • java.awt.geom.Line2D

8.使用颜色
使用Graphics2D类的setPaint方法可以选择颜色。Color用于定义颜色。可以通过红、绿、蓝三色成分来创建一个Color对象,以达到定制颜色的目的,调用Color构造器的格式为:Color(int redness,int greenness,int blueness)
要想设置背景颜色就需要使用Component类中的setBackground方法。Color类中的brighter方法和darker方法的功能分别是加亮或变暗当前的颜色。
Java在SystemColor类中预定义了很多颜色的名字。

9.文本使用特殊字体
可以通过字体名指定一种字体。字体名由字体家族名和可选后缀组成。要想知道计算机上允许使用的字体,就需要调用GraphicsEnvironment类中的getAvailableFontFamilyNames方法,它会返回一个字符型数组,其中包含了所有可用的字体名。GraphicsEnvironment描述了用户系统的图形环境,为了得到这个类的对象需要调用静态的getLocalGraphicsEnvironment方法。
要用某种字体绘制字符,必须首先利用指定的字体名、字体风格和字体大小来创建一个Font类对象。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值