Java编程——图形程序设计
目录:
- 基础知识
- 窗体组件类结构
- Swing和AWT对比
- 组件(Component & JComponent)
- 顶层窗体(Frame & JFrame)
- 工具类(Toolkit)
- 窗口(Window)
- 字体(Font)
- 图形(Graphics)
- 容器(Container)
- 按钮(JButton)
- 选择组件(多选按钮、单选按钮、下拉框)
- 对话框(JDialog)
- 下拉框(JComboBox)
- 文本输入(文本框、密码框、文本域、标签和标签组件)
- 事件处理(event)
- 设计模式
- 布局管理器
一、基础知识
1、窗体组件类结构:
- java.lang.Object
- java.awt.Component(图形对象)
- java.awt.Container(容器对象)
- javax.swing.JComponent(组件)
- JPanel(面板,要放在窗体或对话框中)
- JOptionPane(小对话框)
- JButton(按钮)
- JLabel(标签)
- JTextField(文本框)
- JTextArea(文本域)
- JPassword(密码框)
- JComBox(下拉框)
- JList(列表框)
- JCheckBox(多选按钮)
- JRadioButton(单选按钮)
- JList(列表框)
- java.awt.Window(窗口)
- java.awt.Dialog(对话框)
- java.swing.JDialog(对话框)
- java.awt.Frame(窗体)
- java.swing.JFrame(窗体)
- java.awt.Dialog(对话框)
- javax.swing.JComponent(组件)
- java.awt.Container(容器对象)
- java.awt.Component(图形对象)
2、Swing和AWT对比:
- AWT(Abstract Window Toolkit,抽象窗口工具箱):基本AWT库采用将处理用户界面元素的任务委派给每个目标平台(Windows等)的本地GUI工具箱的方式,由本地GUI工具箱负责用户界面元素的创建和动作。因此,观感的效果依赖于目标平台。
- Swing提供能力更强大的用户界面组件,对底层平台依赖得很少,因此与平台相关的bug很少。Swing给予不同平台的用户一致的感觉。
- Swing是指“被绘制的”用户界面类;AWT是指像事件处理这样的窗口工具箱的底层机制。
3、组件(Component & JComponent):
- 常用方法:
- Dimension getPreferredSize():覆盖这个方法,返回这个组件的首选大小
- void setLocation(int x, int y)和setBounds(int x, int y, int width, int height):设置组件的位置
- void repaint():重新绘制组件
- void paintComponent(Graphics g):覆盖这个方法来描述应该如何绘制自己的组件
- void setBackground(Color c):设置背景颜色
- void setForeground(Color c):设置前景颜色
- (JComponent)void revalidate():重新计算组件的位置和大小
- void setFont(Font f):设置组件的字体
4、顶层窗体(Frame & JFrame):
- 窗体被设计为放置组件的容器,可以将菜单栏和其他的用户界面元素放置在其中。
- 常用方法:
- void setLocation(int x, int y)和setBounds(int x, int y, int width, int height):设置框架的位置
- JFrame void setDefaultCloseOperation(参数):
- JFrame.HIDE_ON_CLOSE:隐藏窗体,但不停止程序
- JFrame.DO_NOTHING_ON_CLOSE:无任何操作
- JFrame.EXIT_ON_CLOSE:隐藏窗体,并停止程序
- JFrame.DISPOSE_ON_CLOSE:释放窗体资源
- void setIconImage(Image image):在标题栏、任务切换窗口等位置显示哪个图标
- void setSize(int width, int height):设置窗体的大小,单位:像素(继承Window)
- void setLocation(int width, int height):设置座标,单位:像素(继承Window)
- void setBounds(int x, int y, int width, int height):设置窗体座标、大小,单位:像素(继承Window)
- void setTitle(String s):改变标题栏的文字
- void setResizable(boolean b):利用一个boolean值确定窗体的大小是否允许用户改变
- Container getContentPane():返回这个JFrame的窗体容器对象
- Component add(Component c):将一个给定的组件添加到该框架的内容窗格中
5、工具类(Toolkit):
- static Toolkit getDefaultToolkit():返回默认的工具箱
- Dimension getScreenSize():返回用户屏幕的尺寸
6、窗口(Window):
- 常用方法:
- void pack():调整窗口大小,要考虑到其他组件的首选大小
- void toFront():将这个窗口显示在其他窗口前面
- void toBack():将这个窗口移动到桌面窗口栈的后面,并相应地重新排列所有的可见窗口
- void setLocationByPlatform(boolean b):该属性在窗口显示之前被设置,由平台选择一个合适的位置
7、字体(Font):
- 常用方法:
- Font(String name, int style, int size):创建一个新字体对象,style如PLAIN、BOLD、ITALIC、BOLD+ITALIC等
8、图形(Graphics):
- 常用方法:
- void setFont(Font font):设置当前的字体,这种字体被应用于后续的文本绘制操作中。
- void drawString(String str, int x, int y):采用当前字体和颜色绘制一个字符串。
- boolean drawImage(Image img, int x, int y, ImageObserver observer):绘制一幅非比例图像。
- boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer):绘制一幅比例图像。系统按照比例将图像放入给定宽和高的区域。
- void copyArea(int x, int y, int width, int height, int dx, int dy):拷贝屏幕的一块区域。
9、容器(Container):
- 常用方法:
- void setLayout(LayoutManager m):为容器设置布局管理器
- Component add(Component c):将组件添加到容器中
- void remove(Component comp):删除组件
- void validate():验证容器中的组件(刷新)
- void setBackground(Color c):设置背景颜色(继承Component)
10、按钮(JButton):
- 常用方法:
- void setEnabled(boolean b):按钮不可点击为false,可点击为true
11、选择组件:
- 多选按钮(JCheckBox):
- 用户通过点击某个多选按钮来选择相应的选项,再点击则取消复选。当多选按钮获得焦点时,用户也可以通过按空格键来切换选择。
- 常用方法:
- boolean isSelected():获取多选按钮的选择状态(继承AbstractButton类)
- void setSelected(boolean b):设置多选按钮的选择状态(继承AbstractButton类)
- 单选按钮(JRadioButton):
- 为单选钮组构造一个ButtonGroup对象。然后,再将JRadioButton类型的对象添加到按钮组中。按钮组负责在新按钮被按下时,取消前一个被按下的按钮的选择状态。
- ButtonGroup g = new ButtonGroup();
- g.add(new JRadioButton("按钮1", false));第二个参数false表明这个按钮初始状态是不被选择
- 下拉框(JComboBox):
- 当用户点击下拉框时,用户可以从中进行选择。
- 常用方法:
- comboBox.addItem("身份证");
- comboBox.addItem("户口簿");
- void removeItem(Object item):从选项列表中删除一个选项
- 或者使用数组:JComboBox<String> combox = new JComboBox<>(items);//items为String数组
- 或者创建下拉列表模型,然后向列表中添加数据模型:ComboBoxModel cm = new DefaultComboxModel<>(items); combox.setModel(cm)
- comboBox.setBounds(10,10, 80, 20):设置下拉列表座标和大小
- c.add(comBox);
- combox.setEditable(true):设置下拉框可编辑
12、对话框(JDialog):
- 常用方法:
- Container getContentPane():返回这个JDialog的窗体容器对象
- 构造方法:JDialog(Frame owner, String title, boolean modal):参数一:父窗体对象;参数二:对话框标题;标题三:是否阻塞父窗体
13、列表框(JList):
- 常用方法:
- DefaultListModel<String> model = new DefaultListModel<>();//列表框数据模型
- for(String tmp:items){model.addElement(tmp);//向数据模型添加元素}
- 设置选择模式:
- jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION):随便选
- jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION):单选
- jl.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION):只能选择相邻的元素
- 为列表框添加滚动条:JScrollPane js = new JScrollPane(jl)
- js.setBounds(10, 10, 100, 100):设置座标和大小
- jl.getSelectedValuesList():获取列表框中选中的所有元素
14、文本输入:
- 文本框(JTextField):
- 只能接收单行文本的输入
- 常用方法:
- void setColumns(int columns):设置文本框长度
- void setFont(Font f):设置字体格式
- void setText(String t):设置文本(继承JTextComponent)
- String getText():获取文本框中的内容
- 密码框(JPasswordField):
- 只能接收单行文本的输入,但不会将输入的内容显示出来。每个输入的字符都用回显字符(echo character)表示。
- 常用方法:
- void setColumns(int columns):设置密码框长度
- void setFont(Font f):设置字体格式
- void setEchoChar(char c):设置回显字符
- char[] getPassword():获取密码的字符数组,String str = new String(ch),将字符数组转换为String
- 文本域(JTextArea):
- 能接收多行文本的输入
- 常用方法:
- void setFont(Font f):设置字体格式
- void setColumns(int columns):设定列数,使用setColumns方法改变了一个文本域的大小之后,需要调用包含这个文本框的容器的revalidate方法。调用该方法后,布局管理器会重新设置容器的大小。
- void setRows(int rows):设定行数
- void setText(String t):设置文本(继承JTextComponent)
- void append(String str):添加内容
- void insert(String str, int pos) :插入内容,在第pos个位置之后插入内容
- void setLineWrap(boolean wrap):设置换行特性,true为换行
- JScrollPane js = new JScrollPane(textArea);//给文本域添加滚动条
- 标签和标签组件(JLabel):
- 标签时容纳文本的组件,它们没有任何的修饰,也不能响应用户输入。可以利用标签来标识组件。
- 常用方法:
- void setText(String text):更改标签内容
- void setFont(Font font):设置字体(继承JComponent)
- void setIcon(Icon icon):设置图片
15、事件处理(event):
- 事件委托模型(event delegation model)在AWT所知的事件范围内,完全可以控制事件从事件源(event source)到事件监听器(event listener)的传递过程,并将任何对象指派给事件监听器。
- AWT事件处理机制:
- 监听器对象是一个实现了特定监听器接口的类的实例。
- 事件源是一个能够注册监听器对象并发送事件对象的对象。
- 当事件发生时,事件源将事件对象传递给所有注册的监听器。
- 监听器对象将利用事件对象中的信息决定如何对事件做出响应。
- 事件监听器对象通常需要执行一些对其他对象可能产生影响的操作。可以策略性地将监听器类放置在需要修改状态的那个类中。
- java.awt.event将事件分成底层事件(low-level)和语义事件(semantic)
- 语义事件:表示用户动作的事件。(点击按钮、调节滚动条)
- 底层事件:形成那些事件的事件。(按下鼠标、拖动鼠标、在按钮区中拾起鼠标)
- 常用的5个底层事件:
- KeyEvent:一个键被按下或释放
- MouseEvent:鼠标键被按下、释放、移动或拖动
- MouseWheelEvent:鼠标滚轮被转动
- FocusEvent:某个组件获得焦点或失去焦点
- WindowEvent:窗口状态被改变
- 常用的语义事件:
- ActionEvent:对应按钮点击、菜单选择、选择列表项或在文本框中Enter
- AdjustmentEvent:用户调节滚动条
- ItemEvent:用户从复选框或列表框中选择一项
16、设计模式:
- 容器和组件:组合模式(composite)
- 带滚动条的面板:装饰器模式(decorator)
- 布局管理器:策略模式(strategy)
- 模型-视图-控制器模式(model-view-controller)
- 模型:存储内容,必须实现改变内容和查找内容的方法。
- 视图:显示内容,每个视图可以显示全部内容的不同部分或不同形式。
- 控制器:处理用户输入事件,然后决定是否把这些事件转化成对模型或视图的改变。
17、布局管理器:
- 通常,组件放置在容器中,布局管理器决定容器中的组件具体放置的位置和大小。
- 绝对定位:不使用任何布局管理器
- frame.setLayout(null)
- 流布局管理器(Flow Layout manager):面板的默认布局管理器,将维持每个组件的最佳尺寸。默认是居中布局
- c.setLayout(new FlowLayout(FlowLayout.Right, 20, 20)):给容器设置流布局,右对齐,左右间隔20,上下间隔20。
- 边界布局管理器(Border Layout manager):JFrame窗体的默认布局管理器,分为东西南北中(EAST、WEST、SOUTH、NORTH、CENTER常量),默认添加到CENTER区。同一区域的组件会覆盖。边框布局会扩展所有组件的尺寸以便填满可用空间。
- frame.add(component, BorderLayout.SOUTH)
- 网格布局管理器(Grid Layout manager):按照行列排列所有的组件,每个单元大小都是一样的。
- panel.setLayout(new GridLayout(4, 4, 1, 2)):4行4列,水平间距为1像素,垂直间距为2像素。如果组件数目多于网格数,网格自动扩展。
- 网格组布局管理器(GridBag Layout manager):
- GridBagLayout gridBag= new GridBagLayout();
- 容器对象.setLayout(grifBag);
- GridbagConstraints 约束对象 = new GridbagConstraints();组件的约束
- 容器对象.add(组件对象, 约束对象);
- GridBagConstraints常用属性:
- gridx, gridy:组件所在的位置
- gridwidth, gridheight:组件占用的行数和列数
- anchor:组件所在的方位
- fill:组件的填充方式,NONE,HORIZONTAL,VERTICAL,BOTH
- insets:组件与单元格边缘的最小距离,top, left, bottom, right
- ipadx, ipady:组件的首选大小
- weightx, weighty:一个单元格的最大宽高
- 绝对定位:不使用任何布局管理器
参考文献:
[1]Cay S. Horstmann. Java核心技术 卷Ⅰ基础知识(原书第10版). [M]北京:机械工业出版社,2016.09;