您现在的位置:首页 > >

Java软件设计基础

发布时间:

Java软件设计基础
GUI设计进阶

1.布局设计
? 布局概述
– Java的GUI组件在容器中放置,它们的位置由容器的布局管理器来 安排。后台工作的布局管理器能够将组件放置在正确的位置。 – java.awt
? FlowLayout ? BorderLayout ? CardLayout ? GridLayout ? GridBagLayout
– java.swing
? BoxLayout ? ScrollPanelLayout ? ViewportLayout ? OverLayout
School of Computer Science and Technology

? FlowLayout

– 布局策略

? 将容器的组件按照加入的先后顺序从左至右依次排列,一行排满后 就转到下一行继续从左至右顺序排列,每一行中的组件都居中排列, 组件间默认的水平和垂直间隙是五个像素。

? FlowLayout是JPanel与Applet默认的布局管理策略。
– 构造方法

FlowLayout()

创建一个FlowLayout居中布局,组件间水平和垂直间隙 均为5个像素

FlowLayout(int align) FlowLayout(int align, int h, int v)

创建一个FlowLayout布局,对齐方式为align,组件间水 平和垂直间隙均为5个像素
创建一个FlowLayout布局,对齐方式为align,组件间水 平和垂直间隙分别为h和v个像素

School of Computer Science and Technology

– 示例
import java.awt.*; import javax.swing.*; public class Flows extends JFrame{
private JButton but1,but2,but3; public Flows(){
super("FlowLayout演示程序"); FlowLayout layout = new FlowLayout(FlowLayout.CENTER); Container c = getContentPane(); c.setLayout(layout); layout.setHgap(8); but1= new JButton("left"); but2= new JButton("center"); but3= new JButton("right"); c.add(but1); c.add(but2); c.add(but3); setSize(300,100); show(); } public static void main(String args[]){ Flows app = new Flows(); } }
School of Computer Science and Technology

? 两种程序格式的比较
class FrameName extends Jframe{ public FrameName(){ 框架属性、组件设置; } public static void main(String args[]){ FrameName f=new FrameName(); }
}

class AppName{ public static void main(String args[]){ Frame f=new Frame(); 定义组件; f.add(组件对象); ……
} }

创建一个GUI应用程序就是要创建一个框架,用扩展JFrame类来定义一个 框架是很自然的;对框架中组件和函数的修改增减可以很方便的在框架的构 造函数中完成;这样的方式集成性和封装性更好,也易于重复使用,如为其 创建多个实例来获得多个框架。

School of Computer Science and Technology

? GridLayout

– 布局策略

? 在一个二维网格中布置组件。将容器划分为若干行若干列的网格区 域,每个网格的大小相等,组件就位于这些划分出来的小格中,一个 网格可以放置一个组件。组件可被依次的放在第一行第一列、第一行 第二列……的顺序进行。
? 通过在一个网格中放置容器,可以实现嵌套。
? GridLayout也称为网格布局管理器,该布局比较灵活,划分多少网格 由程序自由控制,组件定位也比较精确。

– 构造方法
GridLayout() GridLayout(int r, int c) GridLayout(int r, int c, int h, int v)

创建一个GridLayout布局
创建一个r行c列的GridLayout布局
创建一个r行c列的GridLayout布局,组件间水平和垂直 间隙分别为h和v个像素

School of Computer Science and Technology

– 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GridsExam extends JFrame{
private JButton b[ ]; private String names[ ] = {"1-1","1-2","1-3","2-1","2-2","2-3"}; private Container c; private GridLayout layout; public GridsExam(){
super("GridLayout"); layout = new GridLayout(2,3,14,16); c = getContentPane(); c.setLayout(layout); c.setBackground(Color.pink); b = new JButton[names.length]; for(int i=0;i<names.length;i++){
b[i] = new JButton(names[i]); c.add(b[i]); } setSize(350,160); show(); } public static void main(String args[]){ GridsExam gg = new GridsExam(); gg.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){System.exit(0);} }); }
School of} Computer Science and Technology

? BorderLayout

– 布局策略

? BorderLayout也称为边界布局管理器, 是Window、Frame和Dialog默 认的布局管理策略。

? 将窗口分为North/East/South/West/Center五个区域,中间的区域最 大。南北组件可以水平扩展,东西组件可以垂直拉伸;每加入一个组 件都应该指明添加到哪个区域,若不指明则默认添加至Center区域。

– 构造方法
BorderLayout() BorderLayout(int h, int v)

创建一个BorderLayout
创建一个BorderLayout布局,组件间水平和垂直间隙分别为h和 v个像素

– 一般方法

add(Component comp, Object con)

加入组件comp,con指明组件被加入的位置

School of Computer Science and Technology

– 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Borders extends JFrame implements ActionListener{
private JButton b[ ]; private String names[ ] = {“NORTH”,”SOUTH”,”WEST”,”EAST”,”CENTER”}; private BorderLayout layout; public Borders(){
super(“BorderLayout演示程序”); layout = new BorderLayout(5,5); Container c = getContentPane(); c.setLayout(layout); b = new JButton[names.length]; for(int i=0;i<names.length;i++){
b[i] = new JButton(names[i]); b[i].addActionListener(this); } c.add(b[0],BorderLayout.NORTH); c.add(b[1],BorderLayout.SOUTH); c.add(b[2],BorderLayout.WEST); c.add(b[3],BorderLayout.EAST); c.add(b[4],BorderLayout.CENTER); setSize(400,300); show(); }
School of Computer Science and Technology

–续
public void actionPerformed(ActionEvent e){ for(int i=0;i<b.length;i++){ if(e.getSource()==b[i]) b[i].setVisible(false); else b[i].setVisible(true); } layout.layoutContainer(getContentPane());
} public static void main(String args[]){
Borders bb = new Borders(); bb.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);
} }); } }
School of Computer Science and Technology

School of Computer Science and Technology

? CardLayout

– 布局策略
? CardLayout也称为卡式布局管理器。可实现多个组件在同一容器区域 内重叠放置、交替显示。通过用户的操作可将组件一个接一个显示出 来,即容纳多个组件的同时只能从这些组件中选出一个来显示,这个 被显示的组件将占据所有的容器空间。
– 构造方法

CardLayout()
CardLayout(int h, int v)
– 一般方法

创建一个CardLayout 创建CardLayout布局,组件间水平和垂直间隙分别为h和v个像素

first(Container c) last(Container c previous(Container c) next(Container c) add(String t, Component c)

显示Container中的第一个对象 显示Container中的最后一个对象 显示Container中的上一个对象 显示Container中的下一个对象 将组件c加到容器中并指定与c对应的选项卡文本提示为t

School of Computer Science and Technology

– 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CardsExam extends JFrame{
private JButton but1,but2,but3; private Icon icon1,icon2,icon3; private CardLayout layout; private Container c; public CardsExam(){
super("CardLayout演示程序"); layout = new CardLayout(10,10); c = getContentPane(); icon1 = new ImageIcon("1.jpg"); icon2 = new ImageIcon("2.jpg"); icon3 = new ImageIcon("3.jpg"); but1 = new JButton("Button1",icon1);c.add(but1); but1.addActionListener(new listener()); but2 = new JButton("Button2",icon2);c.add(but2); but2.addActionListener(new listener()); but3 = new JButton("Button3",icon3);c.add(but3); but3.addActionListener(new listener()); c.setLayout(layout); setSize(300,150); show(); }
School of Computer Science and Technology

–续
private class listener implements ActionListener{ public void actionPerformed(ActionEvent e){ if(e.getSource()==but1||e.getSource()==but2||e.getSource()==but3) layout.next(c); }
} public static void main(String args[]){
ardsExam cc = new CardsExam(); } }
School of Computer Science and Technology

? GridBagLayout
– 布局策略
? 采用网格的形式来布置组件,允许指定的组件跨多行或多列,同时 允许组件部分重叠。 ? 组 件 的 位 置 和 大 小 由 GridBagConstraints 类 的 对 象 实 例 决 定 。 GridBagConstraints类规范组件使用GridBagLayout布局管理器的限制条件。 ? GridLayout也称为网格包布局管理器,是Java提供的最灵活、最复杂 的布局管理器之一。
– 构造方法
GridBagLayout gridBag = new GridBagLayout(); GridBagConstraints con = new GridBagConstraints();
School of Computer Science and Technology

– GridBagLayout的方法

GridBagLayout()

创建一个GridBagLayout布局

setConstrains(Component GridBagConstraints cons)

comp, 设置网格包约束条件,comp是被加入的组件,并用cons指定为 GridBagConstraints类的一个实例

add(Component comp, Object cons)

添加组件,并用cons指定GridBagConstraints类的一个实例

– GridBagConstraints的属性

fill

当组件比所在网格小时的填充方式 NONE, HORIZONTAL, VERTICAL, BOTH

anchor

当组件小于显示区域网格时决定组件 CENTER(默认值), NORTH, NORTHEAST, EAST, SOUTH,

放置的位置

SOUTHEAST, SOUTHWEST, WEST, NORTHWEST

insets

填充组件和网格边缘间的部分,负值 默认为insets(0,0,0,0),四个参数分别代表上下左

导致组件延伸到网格单元的外边



gridx gridy

指定组件的左上角所在的行和列

第一行或第一列均用0表示

gridwidth girdheight

指定组件显示区域所占行数和列数

整数,值为Remainder表示组件为当前行或列的最后 一个组件,Relative则表示紧挨着当前行或列组件后

weightx

指定分配给组件的额外水平空间和额 浮点数

weighty

外垂直空间

School of Computer Science and Technology

– 实例
import java.awt.*; import java.awt.event.*; public class GridBags extends JFrame{
public static void main(String args[]){ Frame f = new Frame("GridBagLayout"); GridBagLayout g1 = new GridBagLayout(); GridBagConstraints con = new GridBagConstraints(); con.fill = GridBagConstraints.HORIZONTAL; f.setLayout(g1); Button but1 = new Button("Data input"); Button but2 = new Button("Data modified"); Button but3 = new Button("Data query"); Button but4 = new Button("Data print"); Button but5 = new Button("Data delete"); g1.setConstraints(but1,con); con.weightx = 1.2;f.add(but1); g1.setConstraints(but2,con);f.add(but2); g1.setConstraints(but3,con);f.add(but3); con.gridwidth = GridBagConstraints.REMAINDER; g1.setConstraints(but4,con);f.add(but4); g1.setConstraints(but5,con);f.add(but5); f.setSize(250,100); f.setBackground(Color.cyan); f.setVisible(true);
}
School of} Computer Science and Technology

? BoxLayout

– 布局策略

? 又称为盒式布局管理器,在java.swing.border包中。
? 有垂直和水平两种排列方式,组件加入的先后顺序为从左(上)到右 (下),容器两端是剩余的空间。在策划程序布局时,也可以通过盒式布 局的嵌套达到目的。

? java.swing中提供的Box类是Container类的子类,据此创建的容器称为 盒式容器,默认布局即为BoxLayout且无法更改。

– 构造方法
BoxLayout(Container con, int axis)

创建BoxLayout布局,参数axis决定该布局是行型还 是 列 型 布 局 , 其 有 效 值 是 BoxLayout.X-AXIS 和 BoxLayout.Y-AXIS

School of Computer Science and Technology

– 一般方法
getLayoutAlignmentX(Container con) getLayoutAlignmentY(Container con) setLayoutAlignmentX(Container con) setLayoutAlignmentY(Container con) LayoutContainer(Container con) Box.createHorizontalBox() Box.createverticalBox() Box.createHorizontalStruct(int width)
Box.createverticalStruct(int height)
Box.createHorizontalGlue() Box.createverticalGlue()

获得容器沿X轴的对齐方式:行排列 获得容器沿Y轴的对齐方式:行排列 设置容器沿X轴的对齐方式:行排列 设置容器沿Y轴的对齐方式:行排列 设置con窗口的布局方式为BoxLayout布局 构建一个行型盒式布局的Box容器组件 构建一个列型盒式布局的Box容器组件 构建一个不可见的宽度为width的水平Struct类型支 撑对象来控制组件之间的距离 构建一个不可见的宽度为width的水平Struct类型支 撑对象来控制组件之间的距离 构建一个水平方向的Glue组件 构建一个垂直方向的Glue组件

School of Computer Science and Technology

– 实例 import java.awt.*;
import java.awt.event.*; import javax.swing.*; public class Boxes extends JFrame{
public Boxes(){ super("BoxLayout"); final int SIZE = 3; Container c = getContentPane(); c.setLayout(new BorderLayout(30,30)); Box boxes[ ] = new Box[4]; boxes[0] = Box.createHorizontalBox();boxes[1] = Box.createVerticalBox(); boxes[2] = Box.createHorizontalBox();boxes[3] = Box.createVerticalBox(); for(int i=0;i<SIZE;i++) boxes[0].add(new JButton("class"+i)); for(int i=0;i<SIZE;i++) boxes[1].add(new JButton("grade"+i)); for(int i=0;i<SIZE;i++) boxes[2].add(new JButton("classroom"+i)); for(int i=0;i<SIZE;i++) boxes[3].add(new JButton("restroom"+i)); c.add(boxes[0],BorderLayout.NORTH);c.add(boxes[1],BorderLayout.WEST); c.add(boxes[2],BorderLayout.SOUTH);c.add(boxes[3],BorderLayout.EAST); setSize(350,300); show();
} public static void main(String args[]){
Boxes bb = new Boxes(); bb.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){System.exit(0);} }); } }
School of Computer Science and Technology

2.菜单组件

? 菜单栏

– 用来管理菜单,只能被添加到Frame对象中。作为整个菜单的根基 不参与交互操作。Java中,应用程序的菜单都包含在菜单栏对象中。 在awt中由MenuBar负责创建,在swing中由JMenuBar负责创建。
– 构造方法与一般方法

JMenuBar类 MenuBar类

JMenuBar() setJMenuBar(JMenuBar menu) MenuBar() add(Menu m)

? 菜单

创建一个空菜单栏 将菜单栏添加到窗口的菜单栏区域 创建一个空菜单栏 将一个Menu对象m添加到引用的MenuBar对 象中

– 用来存放与整合菜单项的组件。菜单可以是单层的菜单,也可以为 多层结构。awt中由Menu负责创建,swing中由JMenu负责创建。

School of Computer Science and Technology

– 构造方法与一般方法

JMenu类 Menu类

JMenu() JMenu(String menuName) add(String s) getItem(int n) getItemCount() add(JMenuItem item) addSeparator() Menu() Menu(String menuName) add(MenuItem item) addSeparator()

创建一个无标签的菜单对象 创建一个菜单名为menuName的菜单对象 向菜单增加指定的选项 获取指定索引处的菜单选项 获取菜单选项数目 将item添加到引用的菜单对象上 在目前位置插入一条分隔线 创建一个无标签的菜单对象 创建一个菜单名为menuName的菜单对象 将item添加到引用的菜单对象上 在目前位置插入一条分隔线

School of Computer Science and Technology

? 菜单项
– 是菜单系统的基本组件,是用户最终选择的项目。在awt中由 MenuItem负责创建,在swing中由JMenuItem负责创建。菜单项本身 也可以是菜单,称为子菜单。
– 菜单项也可以使用带复选框或单选按钮的菜单项,分别是:
? awt: CheckBoxMenuItem
RadioButtonMenuItem
? swing:JCheckBoxMenuItem
JRadioButtonMenuItem
? 例:创建单选按钮菜单项和创建复选框菜单项
ButtonGroup group = new ButtonGroup(); JRadioButtonMenuItem SchItem = new JRadioButtonMenuItem(“JRadio”); group.add(SchItem); SchMenu.add(SchItem);
JCheckButtonMenuItem DoItem = new JCheckButtonMenuItem(“DoBar”); optionMenu.add(DoItem);
School of Computer Science and Technology

– 构造方法与一般方法:

JMenuItem类

JMenuItem(String s) JMenuItem(String s,Icon i) JRadioButtonMenuItem(String s) JCheckButtonMenuItem(String s) setEnabled(boolean b) getLabel() getKeyStroke(char keyChar) setAccelerator(KeyStroke k) MenuItem(String s) getActionCommand()

MenuItem类

disable() JCheckButtonMenuItem(String s)

getState()

School of Computer SciesentSctaete(abnoodleaTnebc) hnology

创建名为s的菜单项 创建名为s、图标为i的菜单项 创建标题为s带单选按钮的菜单项 创建标题为s带复选框的菜单项 设置当前菜单项是否可被选择 获取菜单项名字 返回一个字符型的KeyStroke对象 为菜单项设置快捷键 创建名为s的菜单项 返回菜单项对象所产生的动作事件 关联的命令名称 设置当前菜单项不可用 创建标题为s带复选框的菜单项 获取复选框的状态 设置复选框的状态

? 弹出式菜单
– 不固定在菜单栏中,而是可以四处浮动显示,依附于某个容器或 组 件 , 平 时 并 不 显 示 , 在 单 击 鼠 标 右 键 时 显 示 。 在 awt 中 由 PopupMenu负责创建,在swing中由JPopupMenu负责创建。
JpopupMenu popup = new JpopupMenu(); JMenuItem newItem = new JMenuItem(“Popup Menu”); popup.add(newItem);
? 菜单创建步骤
– 创建菜单栏对象,并将其加入到所建的框架中:
JMenuBar menuBarName = new JMenuBar(); setJMenuBar(menuBarName);
– 创建菜单及其子菜单
JMenu fileMenu = new Jmenu(“File”); JMenu toolMenu = new Jmenu(“Tool”); JMenu optionMenu = new Jmenu(“Option”);
School of Computer Science and Technology

– 通过Action对象新建菜单项并添加事件监听器
newItem = fileMenu.add(new ShowAction(“New”));
– 将菜单项加入到子菜单或菜单中,将子菜单加入到菜单中,将菜 单加入到菜单栏中
fileMenu.add(newItem); toolMenu.add(optionMenu); menuBarName.add(fileMenu); menuBarName.add(toolMenu);
? 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MenuExam extends JFrame{
private JLabel display; public MenuExam(){
super(“Menu演示程序”); JMenuBar bar = new JMenuBar(); setJMenuBar(bar); JMenu fileMenu = new JMenu(“File”);
School of Computer Science and Technology

–续

JMenuItem fileNew = new JMenuItem(“New”); JMenuItem fileOpen = new JMenuItem(“Open”); JMenuItem fileSave = new JMenuItem(“Save”); JMenuItem fileExit = new JMenuItem(“Exit”); fileMenu.add(fileNew); fileMenu.add(fileOpen); fileMenu.add(fileSave); fileMenu.add(fileExit); bar.add(fileMenu); fileExit.addListener(new ActionListener(){ public void actionPerformed(ActionEvent e){
System.exit(0); } }); JMenu editMenu = new JMenu(“Edit”); JMenuItem copyMenu = new JMenuItem(“Copy”); JMenuItem pasteMenu = new JMenuItem(“Paste”); JMenuItem cutMenu = new JMenuItem(“Cut”); JMenuItem selectMenu = new JMenuItem(“Select”); editMenu.add(copyMenu); editMenu.add(pasteMenu); editMenu.add(cutMenu); editMenu.addSeparator(); editMenu.add(selectMenu); bar.add(editMenu);

School of Computer Science and Technology

–续
JMenu formatMenu = new JMenu(“Format”); JMenuItem colorMenu = new JMenuItem(“Color”); JMenuItem fontMenu = new JMenuItem(“Font”);
formatMenu.add(colorMenu); formatMenu.add(fontMenu); bar.add(formatMenu); setSize(300,200); show(); } public static void main(String args[]){ MenuExam mm = new MenuExam(); mm.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);
} }); }
School of Computer Science and Technology

3.swing组件
? 概述
– swing组件与awt组件的比较
? swing组件在awt基础上构建起来的,基于awt的事件处理机制;所以 完全舍弃awt包不太可能; ? swing组件几乎都是轻量级组件。 ? swing采取了“模型-视图-控制器”(MVC: Model-View-Controller)的设 计范式,其中模型用来保存内容,视图用来显示内容,控制器用来控 制用户输入。 ? 新版的swing包可能与旧版不完全兼容; ? awt包的运行速度比swing快,但swing的功能更趋于完善。
– 采用swing进行GUI设计的一般流程
? 引入swing包,基于使用感觉选择合适的外观并设置顶层容器; ? 向容器内添加并设置组件; ? 在组件周围添加辅助属性并进行事件处理。
School of Computer Science and Technology

– swing中的包

javax.swing

swing组件和实用工具

javax.swing.border

swing轻组件的边框

javax.swing.colorchooser

JColorChoose的支持类/接口

javax.swing.event

事件和监听器类

javax.swing.plaf

抽象类,定义UI代理的行为

javax.swing.plaf.basic

实现所有标准界面样式公共功能的基类

javax.swing.plaf.metal

用户界面代理类,实现Metal界面样式

javax.swing.table

JTable组件的支持类

javax.swing.text

支持文档的显示和编辑

javax.swing.text.html

支持显示和编辑html文件

javax.swing.text.html.parser

html文件的分析器类

javax.swing.text.rtf

支持显示和编辑RTF文件

javax.swing.tree

JTree组件的支持类

javax.swing.undo

支持取消操作

com.sun.javax.swing.plaf.motif

用户界面代理类,它们实现Motif界面样式

com.sun.javax.swing.plaf.windows

用户界面代理类,它们实现Windows界面样式

School of cComo.msunp.jauvatx.eswrinSg.pclaife.gtnk ce and Te用ch户n界o面lo代g理y类,它们实现GTK界面样式

– swing包中的类层次结构

JComboBox AbstractButton
JFileChooser

JMenuItem JButton
JToggleButton

javax.swing.JComponent java.awt.Container

JInternalFrame JLabel JPanel

java.awt.Component java.lang.Object

JList JMenuBar JTextComponent
……

JDesktopPane JEditorPane JTextArea JTextField

JLayeredPane

……

JTable

School of Computer Science and Technology

JCheckBoxMenuItem JMenu
JRadioButtonMenuItem JCheckBox
JRadioButton
JFormattedTextField JPasswordField

– swing组件的分类
? 按照功能划分
– 基本控件:实现人机交互的基本组件。包括JButton、JcomboBox、JList、 JMenu、JSlider、JTextField、JTexAtrea、JPasswordField; – 顶层容器:包括JFrame、JApplet、JDialog、JWindow; – 中间容器:涵盖JPanel、JScrollPane、JSplitPane、JLayeredPane、JToolBar; – 特殊容器:在GUI上起特殊作用的中间层,如JInternalFrame(内部窗件)、 JRootPane。
? 按swing组件对信息的可编辑与否划分
– 不可编辑信息的显示:如JLabel、JProgressBar、ToolTip; – 可 编 辑 信 息 的 显 示 : 如 JTextField 、 JTextArea 、 JPasswordField 、 JColorChooser、JFileChooser、JTable。
School of Computer Science and Technology

? 组件常用方法
– 组件的颜色
? 组件背景色的设置方法:
public void setBackground(Color c)
? 组件前景色的设置方法:
public void setForeground(Color c)
? 组件背景色的获取方法:
public Color getBackground()
? 组件前景色的获取方法:
public Color getForeground()
? 上述方法中都涉及Color类,Color类是java.awt包中的类,该类窗件的 对象称为颜色对象,Color类的构造方法如下:
public Color(int red, int green, int blue) – 其中red、green、blue的取值在0~255之间。
School of Computer Science and Technology

– 组件的字体
? 组件字体的设置方法:

public void setFont(Font f)
? 组件字体的获取方法:
public void getFont()
? 上述方法用到了java.awt包中的Font类,该类的构造方法如下:
public Font(String name, int style, int size)

– name:字体名字,如果系统不支持字体的名字,将取默认名字创建字 体对象;

– style:字体样式,有效取值为Font.BOLD、Font.PLAIN、Font.ITALIC、

Font.ROMAN_BASELINE



Font.CENTER_BASELINE



Font.HANGING_BASELINE、Font.TRUETYPE_FONE;

– size:字体大小,单位是磅。

? 获取系统中可以提供的字体名字,可以通过GraphicsEnvironment对

象调用getAvailableFoneFamilyNames()方法将可用字体名称存放到字符串

数组中。

School of Computer Science and Technology

– 组件的边框:
? 组件边框的设置方法:
public void setBorder(Border b)
? 组件边框的获取方法:
public Border getBorder()
? 默认情况下组件的边框是黑边矩形。
– 组件透明
? 设置组件的透明性:
public void setOpaque(boolean isOpa) – isOpa取false时组件为透明,取true时被设置为不透明;
? 获取组件的透明性:
public boolean getOpaque() – 组件透明时返回值为false,否则返回值为true;
School of Computer Science and Technology

– 组件的大小与位置
? public void setSize(int width, int height) 设置组件的大小,width指定组件的宽度,height指定组件的高度。
? public void setLocation(int x, int y) 设置组件在容器中的位置。
? public Dimension getSize() 返回一个Dimension对象下组件的宽度和高度值。
? public Point getLocation() 返回一个含有成员变量x和y的Point对象的引用,x和y就是组件在
容器中的坐标。 ? public void setBounds(int x, int y, int width, int height)
设置组件在容器中的位置和组件的大小。
public Rectangle getBounds()
返回一个含有成员变量x、y、width和height的Rectangle对象的引用。
School of Computer Science and Technology

– 组件的激活与可见性
? public void setEnable(boolean b)
设置组件是否可被激活,当b为true时组件可被激活,否则组件不 可激活。
? public void setVisible(boolean b)
设置组件在该容器中的可见性,当b为true时组件可见,否则组件 不可见。
– 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; class CompExam extends JFrame implements ItemListener{
JComboBox list; JTextArea text; CompExam(String s){
super(s); setSize(260,270); setLocation(120,120); setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
School of Computer Science and Technology

–续
text = new JTextArea(12,12); list = new JComboBox(); list.setBackground(Color.pink); text.setForeground(Color.blue); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String fontName[] = ge.getAvailableFontFamilyNames(); for(int i=0;i<fontName.length;i++) list.addItem(fontName[i]); Container c = getContentPane(); c.add(list,BorderLayout.NORTH); c.add(text,BorderLayout.CENTER); list.addItemListener(this); setVisible(true); setBounds(100,120,300,200); validate(); } public void itemStateChanged(ItemEvent e){ String name = (String)list.getSelectedItem(); Font f = new Font(name,Font.BOLD,24); text.setFont(f); text.setText("Font test example"); } }
School of Computer Science and Technology

–续
public class MethodExam{ public static void main(String args[]){ CompExam con =new CompExam("Example"); }
}
School of Computer Science and Technology

? JFrame窗体

– JFrame 是 GUI 中 的 一 个 框 架 容 器 。 javax.swing 包 中 的 JFrame 是 java.awt包中Frame类的子类。

– 构造方法:

JFrame()

创建一个不含标题的新JFrame类窗体对象

JFrame(String s)

创建一个标题为s的新JFrame类窗体对象

– 一般方法:
setSize(int width, int height)

设置JFrame对象的宽和高

setBackground(Color c)

设置JFrame对象的背景色

setVisible(boolean b)

设置JFrame对象的可见性

setResizable(boolean b)

设置JFrame对象是否可以改变大小

JMenuBar getMenuBar()

获得窗口中的菜单栏组件

remove(Component c)

将窗口中指定的组件移除

setDefaultCloseOperation(int op)

单击窗体关闭按钮时的默认操作

setBounds(int x, int y, int width, int height)

设置窗口的坐标和大小

School of Computer Science and Technology

– 使用JFrame的流程

? 当应用程序需要一个窗口时,可使用JFrame或其子类创建一个对象, 窗口默认的被系统添加到显示器屏幕上。 ? JFrame窗体通过调用方法getContentPane()得到它的内容面板。 ? 将组件添加到JFrame窗体的内容面板中去。

? 标签与文本组件

– 标签组件

? JLabel大体与Label一致,但它允许添加图像,而且当鼠标的光标停留 在标签位置时会显示一段文字提示。

? 构造方法:
JLabel() JLabel(String s) JLabel(Icon icon) JLabel(String s, int align)

创建没有名字的标签对象 创建名字为s的标签对象 创建具有图标icon的标签对象,图标左对齐 创建名字为s、对齐方式为align的标签对象

School of Computer Science and Technology

? 一般方法

getText() setIcon(Icon icon)

获取标签名字 设置标签图标

setText(String s) setAlignment(int align)
– 文本组件

设置标签对象的文字 设置标签对象的对齐方式

? JTextField类:定义一个可以输入单行文字的矩形区域文本框;

JTextField()

创建一个空文本框对象

JTextField(String s) JTextField(String s, int n) int getColumns()

创建一个内容为s的文本框对象 创建一个内容为s、列为n的文本框对象 获得文本框对象的列数

setColumns(int n) setFont(Font f)

设置文本框对象的列数 设置文本框的字体

addActionListener(ActionListener e)

将监听者注册给文本框对象

School of Computer Science and Technology

? JTextArea类:定义一个可以输入单行文字的矩形区域文本框;

getColumns()

获得对象的列数

setEditable(boolean b)

指定文本域的可编辑性

setAlignment(int align)

设置文本域的对齐方式

setIcon(Icon icon)

设置图标

setText(String s)

设置文字

? JPasswordField类:定义一个密码框对象。

setEchoChar(char c)

设置回显字符

char[ ] getPassword()

返回密码框中的密码

– 事件机制
? 事件源
– 能够产生时间的对象都可以称为事件源,如文本框、按钮、下拉式列 表等等。

School of Computer Science and Technology

? 监听器
– 通过对事件源进行监听,一以便对发生的事件做处理。事件源通过调 用相应的方法注册相应的监听器。对于注册了监听器的对象,系统将自动 调用相应的事件类创建该类事件的实例,并通知监听器。
? 处理事件的接口
– 当事件源发生事件时,接口立刻通知监听器自动调用实现的某个接口 方法,接口方法规定了怎样处理事件的操作。
? 实例:
import java.awt.*; import java.awt.event.*; import javax.swing.*; class MyWindow extends JFrame implements ActionListener{
JTextField titleText; JPasswordField passwordText; private JLabel lab1,lab2; MyWindow(String s){
super(s); lab1 = new JLabel("name"); titleText = new JTextField(10); lab2 = new JLabel("password");
School of Computer Science and Technology

–续
passwordText = new JPasswordField(10); passwordText.setEchoChar('*'); titleText.addActionListener(this); passwordText.addActionListener(this); Container con = getContentPane(); con.setLayout(new FlowLayout()); con.add(lab1); con.add(titleText); con.add(lab2); con.add(passwordText); con.setBounds(100,100,200,150); con.setBackground(Color.pink); setVisible(true); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ if(e.getSource()==titleText) this.setTitle(titleText.getText()); else if(e.getSource()==passwordText){
char c[] = passwordText.getPassword(); titleText.setText(new String(c)); } } }
School of Computer Science and Technology

–续
public class TExample{ public static void main(String args[]){ MyWindow win = new MyWindow("TextField Example"); }
}
School of Computer Science and Technology

? 按钮组件

– AbstractButton类派生出两个组件:

? JButton组件:swing按钮;
? JToggleButton组件:单选按钮(JRadioButton)和复选框(JCheckButton)的 父类。

– JButton类的构造方法:

JButton() JButton(String s) JButton(Icon icon) JButton(String s, Icon icon)

构造无标题按钮对象 构造标题为s的按钮对象 构造图标为icon的按钮对象 构造标题为s、图标为icon的按钮对象

– JButton类的一般方法:
addActionListener(ActionListener e) removeActionListener(ActionListener e) setText(String s)

给按钮对象增加动作监听器,即注册 移去按钮上的监听器 设置文字

School of Computer Science and Technology

getText()

获取按钮标签文字

setIcon(Icon icon)

设置按钮图标

getIcon()

获取按钮图标

setEnabled(boolean b)

设置当前按钮的可用性

inSelected()

获取按钮状态

setHorizontalTextPosition(int textPosition)

设置按钮名相对水平位置(LEFT/CENTER/RIGHT)

setVerticalTextPosition(int textPosition)

设置按钮名相对垂直位置(TOP/CENTER/BOTTOM)

– 实例

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class LabBut extends JFrame{

private JLabel lab1,lab2;

private JButton but1,but2;

public LabBut(){

super("Label and Button");

Container c = getContentPane();

c.setLayout(new FlowLayout(100,100,10));

Icon icon = new ImageIcon("1.jpg");

Icon icon1=new ImageIcon("2.jpg");

Icon icon2=new ImageIcon("3.jpg");

School of Computer Science and Technology

–续
lab1 = new JLabel("Label with text and image",icon,SwingConstants.CENTER); lab1.setToolTipText("This is a label"); lab1.setHorizontalTextPosition(SwingConstants.CENTER); lab1.setVerticalTextPosition(SwingConstants.BOTTOM); c.add(lab1); Icon icon1=new ImageIcon("2.jpg"); Icon icon2=new ImageIcon("3.jpg"); but1 = new JButton("Button1 with function"); c.add(but1); but2 = new JButton("Button2 with function",icon2); but2.setRolloverIcon(icon1); c.add(but2); but1.addActionListener(new listener()); but2.addActionListener(new listener()); setSize(360,200); show(); } public static void main(String args[]){ LabBut lb = new LabBut(); lb.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);
} }); }
School of Computer Science and Technology

–续
private class listener implements ActionListener{ public void actionPerformed(ActionEvent e){ JOptionPane.showMessageDialog(null,"You pressed:"+e.getActionCommand()); }
} }
School of Computer Science and Technology

– 复选框与单选按钮

? JCheckButton

– 构造方法
JCheckBox()

创建一个无标签复选框对象

JCheckBox(String s)

创建一个标签为s的复选框对象

JCheckBox(String s, Icon icon)

创建一个标签为s、图标为icon的复选框对象

JCheckBox(String s, boolean b)
– 一般方法
void addItemListener(ItemListener i)

创建一个标签为s、状态为b的复选框对象 注册ItemListener监听器

public boolean isSelected()

返回复选框状态

public void setSelected(boolean b)

设置复选框状态

? JRadioButton

– Java提供ButtonGroup类为单选按钮类提供多选一功能,当创建了若干 个单选按钮后,需要将这些按钮添加到ButtonGroup的实例中去。
– JRadioButton构造方法与一般方法与复选框类似,略。

School of Computer Science and Technology

? 复选框与单选按钮事件
– 这 两 种 组 件 引 发 的 事 件 由 ItemEvent 类 派 生 , 该 类 包 含 了 一 个 ITEM_STATE_CHANGE事件。 – ItemEvent类的主要方法:
?Object.getItem()方法:告知用户是哪个选择项的状态发生变化; ?int getStateChange()方法:是用户知道选中了哪个选项。
? 实例:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class RunJRadio extends JFrame{
JPanel jp; JRadioButton jrb1 = new JRadioButton("Male",true); JRadioButton jrb2 = new JRadioButton("Female"); JRadioButton jrb3 = new JRadioButton("student"); ButtonGroup bg = new ButtonGroup();
School of Computer Science and Technology

–续
public RunJRadio(){ super("JRadioButton"); setSize(350,100); jp = new JPanel(); bg.add(jrb1);bg.add(jrb2); jp.add(jrb1);jp.add(jrb2);jp.add(jrb3); this.setContentPane(jp);
} public static void main(String args[]){
RunJRadio r = new RunJRadio(); r.show(); r.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);
} }); } }
School of Computer Science and Technology

? 下拉列表组件
– 下拉列表(JComboBox)
? 构造方法
JComboBox() JComboBox(Vector vect) JComboBox(ComboBoxModel model) JComboBox(Object[ ] items)
? 一般方法
void addActionListener(ActionListener e) void addItemListener(ItemListener e) void addItem(Object obj) Object getItemAt(int index) int getItemCount() public Object getSelectedItem()

创建空下拉列表框 使用向量表创建一个下拉列表对象 从已有的model获得选项创建下拉列表对象 使用数组创建下拉列表对象
注册事件对象给ActionListener 注册事件对象给ItemListener 添加选项 获取指定位置的选项 获得当前选项的数目 获得被选项

School of Computer Science and Technology

void setEditable(boolean b) int getSelectedIndex() void removeAllItems() void removeItemAt(int index) void remove(Component comp)
? 实例

设置是否可以编辑 获取被选中项的索引 移除全部选项 移除索引为index处的选项 移除指定的组件

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Combo extends JFrame{
private JComboBox images; private JLabel label; private String names[]={"1.jpg","2.jpg","3.jpg"}; private Icon icons[]={new ImageIcon(names[0]),new ImageIcon(names[1]),new ImageIcon(names[2])}; public Combo(){
super("JComboBox Example"); Container c=getContentPane(); c.setLayout(new FlowLayout()); images=new JComboBox(names); images.setMaximumRowCount(2);

School of Computer Science and Technology

images.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ label.setIcon(icons[images.getSelectedIndex()]); }
}); c.add(images); label=new JLabel(icons[0]); c.add(label); setSize(450,200); show(); } public static void main(String args[]){ Combo cb=new Combo(); cb.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);
} }); } }
School of Computer Science and Technology

– 列表(JList)
? 构造方法

JList()

创建一个空列表对象

JList(Vector vect)

使用向量表创建一个列表对象

JList(Object[ ] items)

使用数组创建一个列表对象

? 一般方法

int [ ] getSelectedIndices()

获得被选取的多个项

int getSelectedIndex(int i)

获得选取的单个项

void setVisibleRowCount(int num)

设置可见的列表选项

void addListSelectionListener(ListSelectionListener e)

注册监听器

int getVisibleRowCount()

获得可见的列表选项值

? 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*;
School of Computer Science and Technology

public class JListEx extends JFrame{ private JList images; private JLabel label; private String names[]={"1.jpg","2.jpg","3.jpg"}; private Icon icons[]={new ImageIcon(names[0]),new ImageIcon(names[1]),new
ImageIcon(names[2])}; public JListEx(){ super("JList Example"); Container c=getContentPane(); c.setLayout(new FlowLayout()); images=new JList(names); images.setVisibleRowCount(2); images.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); c.add(new JScrollPane(images)); label=new JLabel(icons[0]); c.add(label); images.addListSelectionListener(new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e){ label.setIcon(icons[images.getSelectedIndex()]); } }); setSize(200,200); show(); }
School of Computer Science and Technology

public static void main(String args[]){ JListEx jl=new JListEx(); jl.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });
} }
School of Computer Science and Technology

? 表格组件
– JTable是Swing新增的组件,主要功能是将数据以二维表格的形式 显示出来。

JTable()
JTable(Object data[ ][ ], Object columnName[ ])
JTable(TableModel dm, TableColumnModel cm, TableSelectionModel sm)

创建一个默认模式的表格对象
创建一个表格对象,用来显示二维数组 data 中的值, 其列名称为 columnName
构造 表格对象,使用 dm 作为数据模型、cm 作为列 模型和 sm 作为选择模型对其进行初始化

– 一般方法
getContentPane().属性 repaint(); getRowCount(); getColumnCount(); getColumnName(int col);

获取设置框架中contentPane面板对象下的属性值 表格更新显示 获取表格行数 获取表格列数 获取表格某列名字

School of Computer Science and Technology

getValueAt(int row, int col)

获取现有表格某行某列的数据

setValueAt(Object value, int row, int col)

改变现有表格某行某列的数据

– 注意:

? 用户在表格单元中输入的数据都被认为是一个Object对象;

? 表格中的数据将以行和列的形式显示数组data每个单元中对象的字符 串表示。

– 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; class JTableWin extends JFrame implements ActionListener{
JTable table; Object a[][]; Object name[]={"Name","Num","Price","Sell"}; JButton sumRows,sumColumns; JTextField inputRowsNumber; int initRows=1; JPanel pSouth,pNorth; int count=0,rowsNumber=0;

School of Computer Science and Technology

JTableWin(String s){ super(s); sumRows=new JButton("Good Sales"); sumColumns=new JButton("Total Sales"); inputRowsNumber=new JTextField(4); sumRows.addActionListener(this); sumColumns.addActionListener(this); inputRowsNumber.addActionListener(this); pSouth=new JPanel(); pNorth=new JPanel(); pNorth.add(new JLabel("Input row number,press Enter to confirm")); pNorth.add(inputRowsNumber); inputRowsNumber.setBackground(Color.pink); pSouth.add(sumRows); pSouth.add(sumColumns); getContentPane().add(pSouth,BorderLayout.SOUTH); getContentPane().add(pNorth,BorderLayout.NORTH); getContentPane().add(new JScrollPane(table),BorderLayout.CENTER); setSize(370,250); setVisible(true); getContentPane().validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
School of Computer Science and Technology

public void actionPerformed(ActionEvent e){ if(e.getSource()==inputRowsNumber){ count=0; initRows=Integer.parseInt(inputRowsNumber.getText()); a=new Object[initRows][4]; for(int i=0;i<initRows;i++){ for(int j=0;j<4;j++){ if(j>0) a[i][j]="0"; else a[i][j]=""; } } table=new JTable(a,name); table.setRowHeight(20); getContentPane().removeAll(); getContentPane().add(new JScrollPane(table),BorderLayout.CENTER); getContentPane().add(pSouth,BorderLayout.SOUTH); getContentPane().add(pNorth,BorderLayout.NORTH); validate(); } else if(e.getSource()==sumRows){ int rows=table.getRowCount(); for(int i=0;i<rows;i++){ double sum=1; boolean b=true;
School of Computer Science and Technology

for(int j=1;j<=2;j++){ try{ sum=sum*Double.parseDouble(a[i][j].toString()); }catch(Exception exception){ b=false; table.repaint(); } if(b==true){ a[i][3]=""+sum; table.repaint(); }
} } } else if(e.getSource()==sumColumns){ rowsNumber=table.getRowCount(); if(count==0) count++; else rowsNumber=rowsNumber-1; double totalSum=0; for(int j=0;j<rowsNumber;j++) totalSum=totalSum+Double.parseDouble(a[j][3].toString()); Object b[][]=new Object[rowsNumber+1][4]; for(int i=0;i<rowsNumber;i++)
for(int j=0;j<4;j++) b[i][j]=a[i][j];
b[rowsNumber][0]="There are"+rowsNumber+"classes of goods"; b[rowsNumber][3]="Total salse:"+totalSum;
School of Computer Science and Technology

a=b; table=new JTable(a,name); getContentPane().removeAll(); getContentPane().add(new JScrollPane(table),BorderLayout.CENTER); getContentPane().add(pSouth,BorderLayout.SOUTH); getContentPane().add(pNorth,BorderLayout.NORTH); validate(); } } } public class JTableEx{ public static void main(String args[]){ JTableWin jw=new JTableWin("Table of sales"); } }
School of Computer Science and Technology

? 进度条组件

– JProgressBar类通过用颜色动态填充显示某任务完成的百分比。

– 构造方法

JProgressBar() JProgressBar(int min, int max) JProgressBar(int orient, int min, int max)
– 一般方法
addChangeListener(ChangeListener e) getMaximum getMinimum setMaximum(int n) setMinimum(int n) getValue setValue(int n)

创建一个水平进度条,最小为0,最大为100 创建一个水平进度条,最小为min,最大为max 创建一个进度条,最小为min,最大为max,orient 为HORIZONTAL则为水平条,VERTICAL则为垂直条
进度条注册监听器 获得进度条最大值 获得进度条最小值 设置进度条最大值 设置进度条最小值 获得进度条当前值 设置进度条当前值

School of Computer Science and Technology

setString(String s)

设置进度条上文字信息

setBorderPainted(boolean b)

设置进度条边框是否显示

setStringPainted(boolean b)
– 注意

设置使用百分数还是字符串表示进度

? 进度条的最大值并不是进度条的长度,进度条的长度依赖于放置它 的布局和本身是否试用了setSize()设置了大小;

? 进度条的最大值max是指将进度条平均分成max份。

– 实例

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JProgressBarEx extends JFrame{
private JProgressBar bar; private JButton but; private Container c; private JLabel label;

School of Computer Science and Technology

public JProgressBarEx(){ super("JProgressBar Example"); c=getContentPane(); c.setLayout(new FlowLayout()); bar=new JProgressBar(); but=new JButton("presentation"); c.add(but); bar.setForeground(Color.blue); c.add(bar); label=new JLabel(); c.add(label); but.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ if(bar.getValue()!=bar.getMaximum()) bar.setValue(bar.getValue()+15); else bar.setValue(bar.getMinimum()); } }); bar.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
label.setText("min:"+bar.getMinimum()+";max:"+bar.getMaximum()+";now:"+bar.getValue()); }
}); setSize(350,150); show(); }
School of Computer Science and Technology

public static void main(String args[]){ JProgressBarEx jpb=new JProgressBarEx(); jpb.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });
} }
School of Computer Science and Technology

? 树组件
– 简介
? JTree用来显示一个层次关系分明的一组数据,用树状图表示能给用 户一个直观而易用的感觉。JTree可以通过树形结构分层组织数据来让 用户清楚的了解各个节点之间的关系。 ? 要构造一个树组件必须事先创建出称为节点的对象。节点是树中最 基本的对象,表示在给定层次结构中的数据项。树中只有一个根节点 ,除此以外的节点分为两类:
– 叶节点(即没有子节点的节点) – 分支节点(即有子节点的节点)
? 每个节点关联着一个描述该节点的文本标签和图像图标,其中:
– 文本标签是节点的字符串表示 – 图标指明该节点是否为叶节点
School of Computer Science and Technology

– 实现
? javax.swing.tree包中提供了一个MutableTreeNode接口来实现创建并成 为树节点的对象。
? DefaultMutableTreeNode类是实现了MutableTreeNode接口的类,可以 使用这个类为要创建的树准备节点,其常用构造方法如下:

DefaultMutableTreeNode(Object userObj) 创建没有父节点和子节点、但允许有子节点的树节点, 并使用指定的用户对象对它进行初始化。

DefaultMutableTreeNode(Object userObj, 创建没有父节点和子节点的树节点,使用指定的用户

boolean child)

对象对它进行初始化,仅在指定时才允许有子节点。

? 注册监听器:

– addTreeSelectionListener(TreeSelectionListener e)
– 当鼠标单击树上的节点时,系统将通知监听器自动调用 TreeSelectionListener接口中的方法valueChanged实施相应操作。

School of Computer Science and Technology

– 系统提供的树组件操作方法

JTree(TreeNode root) getParent()

返回一个 JTree,指定的 TreeNode 作为其根,它显示根节 点。
返回此节点的父节点,如果此节点没有父节点,则返回 null。

isLeaf() getChildCount() setAllowsChildren(boolean b) getUserObject()
– 实例

如果此节点没有子节点,则返回 true。 返回此节点的子节点数。 确定是否允许此节点拥有子节点。 返回此节点的用户对象。

import java.awt.*; import javax.swing.*; import javax.swing.tree.*; import javax.swing.event.*; class JTreeWin extends JFrame implements TreeSelectionListener{
JTree tree; public JTreeWin(String s){
super(s); this.setBackground(Color.pink); Container c=getContentPane();
School of Computer Science and Technology

DefaultMutableTreeNode root=new DefaultMutableTreeNode("java programming"); DefaultMutableTreeNode n1=new DefaultMutableTreeNode("swing"); DefaultMutableTreeNode n11=new DefaultMutableTreeNode("Tree"); DefaultMutableTreeNode n12=new DefaultMutableTreeNode("Button"); DefaultMutableTreeNode n2=new DefaultMutableTreeNode("computer network"); DefaultMutableTreeNode n21=new DefaultMutableTreeNode("internet technology"); DefaultMutableTreeNode n211=new DefaultMutableTreeNode("web technology"); DefaultMutableTreeNode n2111=new DefaultMutableTreeNode("HTML"); DefaultMutableTreeNode n2112=new DefaultMutableTreeNode("HTTP"); DefaultMutableTreeNode n22=new DefaultMutableTreeNode("wireless network"); DefaultMutableTreeNode n23=new DefaultMutableTreeNode("grid technology"); DefaultMutableTreeNode n3=new DefaultMutableTreeNode("database"); DefaultMutableTreeNode n4=new DefaultMutableTreeNode("jsp"); DefaultMutableTreeNode n5=new DefaultMutableTreeNode("servlet"); DefaultMutableTreeNode n6=new DefaultMutableTreeNode("thread");
root.add(n1);root.add(n2);root.add(n3);root.add(n4);root.add(n5);root.add(n6); n1.add(n11);n1.add(n12); n2.add(n21);n2.add(n22);n2.add(n23); n21.add(n211); n211.add(n2111);n211.add(n2112); tree=new JTree(root); tree.addTreeSelectionListener(this); JScrollPane sp=new JScrollPane(tree); c.add(sp);
School of Computer Science and Technology

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setBounds(80,80,300,300); c.validate(); validate(); } public void valueChanged(TreeSelectionEvent e){ DefaultMutableTreeNode node=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); if(node.isLeaf()) this.setTitle((node.getUserObject()).toString()); } } public class JTreeEx{ public static void main(String args[]){ JTreeWin win=new JTreeWin("JTree Example"); } }
School of Computer Science and Technology

? 中间容器

– JPanel面板

? 是一类无边框、不能移动、放大、缩小或关闭的容器。

? JPanel不是顶层容器 ,它是作为一个容器加入到其他顶层容器如 JFrame、JApplet中的。

? 构造方法:
JPanel()

创建流布局的新JPanel

JPanel(LayoutManager layout)

创建具有指定布局管理器的新JPanel

? 实例 import java.awt.*;
import java.awt.event.*; import javax.swing.*; public class JPanelEx extends JFrame{
public JPanelEx(){ super("JPanel Example"); final int SIZE=3; Container c=getContentPane(); c.setLayout(new BorderLayout(30,30)); JPanel jp1=new JPanel();

School of Computer Science and Technology

jp1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Button Group 0")); jp1.setLayout(new FlowLayout()); for(int i=0;i<SIZE;i++) jp1.add(new JButton("boxes[0]:"+i)); JPanel jp2=new JPanel(); jp2.setLayout(new GridLayout(3,1)); for(int i=0;i<SIZE;i++) jp2.add(new JButton("boxes[1]:"+i)); JPanel jp3=new JPanel(); jp3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Button Group 2")); jp3.setLayout(new FlowLayout()); for(int i=0;i<SIZE;i++) jp3.add(new JButton("boxes[2]:"+i)); c.add(jp1,BorderLayout.NORTH); c.add(jp2,BorderLayout.CENTER); c.add(jp3,BorderLayout.SOUTH); setSize(350,300); show(); } public static void main(String args[]){ JPanelEx jp=new JPanelEx(); jp.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);
} }); } }
School of Computer Science and Technology

– JScrollPane窗格

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

? 构造方法:

JScrollPane()

创建一个空的JScrollPane,需要时水平和垂直滚动 条都可显示

JScrollPane(int v, int h) JScrollPane(Component c)

创建一个具有指定滚动条策略的空JScrollPane
创建一个显示指定组件内容的JScrollPane,只要组 件的内容超过视图大小就会显示水平和垂直滚动条

JScrollPane(Component c, int v, int h)
– JSplitPane窗格

创建一个显示指定组件内容的JScrollPane,具有指 定滚动条策略

? 拆分窗格:可以用一条拆分线把容器分为左右或上下两个部分,每 个部分中都可以放置组件。

? 构造方法:

School of Computer Science and Technology

JSplitPane(int s, Component c1, Component c2)
? 一般方法:

创建一个具有指定方向和指定组件的新JSplitPane

setDividerLocation(double position)
– JLayeredPane分层窗格

设置分隔条的位置

? 可用来处理组件经常重叠的情况,JLayeredPane可将容器分为五层。

? 构造方法
JLayeredPane()

创建新的JLayeredPane

? 一般方法

setLayer(Component c, int layer)
getLayer(Component c) add(JComponent c. int layer)

设置指定组件的layer属性,使之成为该层中最底部的 组件
返回指定Component的layer属性
添加组件并设置所在的层

School of Computer Science and Technology

? 注意:
– 其中,参数layer取值常量为:
?DEFAULT_LAYER(最底层,与其他层组件发生重叠时将被遮挡) ?PALETIE_LAYER ?MODAL_LAYER ?POPUP_LAYER ?DRAG_LAYER(最上层,组件在移动中不会被遮挡,若有许多组件,鼠标移 动一组件时可把移动组件放到DRAG_LAYER层)
– 若同一层上添加组件时发生重叠,先添加的会遮挡后添加的。
? swing提供两种分层面板
– JLayeredPane – JDesktopPane
?是JLayeredPane的子类,用来容纳内部框架(JInternalFrame)而设置。
– JToolBar工具栏
? 用于显示常用工具控件的容器。用户可以拖拽出一个独立的可显示 工具控件的窗口,设置相关属性:
School of Computer Science and Technology

– JToolBar.HORIZONTAL – JToolBar.VERTICAL
? 构造方法:

JToolBar()

创建新的工具栏;默认的方向为HORIZONTAL

? 一般方法:

getComponentIndex(Component c)

返回指定组件的索引

getComponentAtIndex(int i)

返回指定索引位置的组件

? 实例 import java.awt.*;
import java.awt.event.*; import javax.swing.*; public class JToolBarEx extends JFrame implements ActionListener{
JButton b1,b2,b3; JToolBar jt; JTextArea ta; JScrollPane sp; JPanel p; public JToolBarEx(){
super("JToolBar Example"); addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){System.exit(0);} });

School of Computer Science and Technology

b1=new JButton(new ImageIcon("1.jpg"));b1.addActionListener(this); b2=new JButton(new ImageIcon("2.jpg"));b2.addActionListener(this); b3=new JButton(new ImageIcon("3.jpg"));b3.addActionListener(this); jt=new JToolBar(); jt.add(b1);jt.add(b2);jt.add(b3); ta=new JTextArea(6,30); sp=new JScrollPane(ta); p=new JPanel(); setContentPane(p); p.setLayout(new BorderLayout()); p.setPreferredSize(new Dimension(300,150)); p.add(jt,BorderLayout.NORTH); p.add(sp,BorderLayout.CENTER); show(); } public void actionPerformed(ActionEvent e){ String s=""; if(e.getSource()==b1) s="You have pressed button at left!Please Continue!\n"; if(e.getSource()==b2) s="You have pressed button at center!Please Continue!\n"; if(e.getSource()==b3) s="You have pressed button at right!Please Continue!\n"; ta.append(s); ta.setBackground(Color.pink); } public static void main(String args[]){ new JToolBarEx(); } }
School of Computer Science and Technology

? 多文档界面

– Java实现多文档界面(MDI)常用方式是在一个JFrame窗口中添加若 干个被限制在JFrame中的内部窗体JInternalFrame。

– 在使用时需要将内部窗体事先添加到JDesktopPane桌面容器中。 一个桌面容器可以添加若干个被限制在其内的内部窗体,然后再将 此桌面容器添加到JFrame窗体即可。

– 构造方法:
JDesktopPane()

创建一个新的JDesktopPane

JInternalFrame()

创建不可调整大小的、不可关闭的、不可最大化的、 不可图标化的、没有标题的JInternalFrame

JInternalFrame(String title, boolean resizable, 创建具有指定标题、可调整、可关闭、可最大化和 boolean closable, boolean max, boolean min) 可图标化的JInternalFrame

School of Computer Science and Technology

– 一般方法

add(JInternalFrame c, int layer) setLayer(JInternalFrame c, int layer) getLayer(JInternalFrame c) getAllFrames() getAllFramesInLayer(int layer) getSelectedFrame()

添加内部窗体,指定内部窗体所在的层次 设置内部窗体所在的层次 获取内部窗体所在的层次 返回桌面中当前显示的所有JInternalFrames 返回桌面指定层中当前所显示的所有JInternalFrames 返回此JDesktopPane中当前活动的JInternalFrame,如果 当前没有活动的JInternalFrame,则返回null

addInternalFrameListener(InternalFrameListener listener) 添加指定的侦听器,以从此内部窗体接收内部窗体事件

setMaximizable(boolean b)

设置maximizable属性,该属性确定是否可以通过某个 用户操作最大化此JInternalFrame

setClosable(boolean b)

设置是否可以通过某个用户操作关闭此JInternalFrame

setIconifiable(boolean b)

设置iconable属性,对于能够使JInternalFrame变成一 个图标的用户而言,该属性必须为true

setResizable(boolean b)

设置是否可以通过某个用户操作调整JInternalFrame的 大小

setTitle(String title)

设置JInternalFrame的标题

setVisible()

设置内部窗体可见性

School of Computer Science and Technology

– 注意:
? 内部窗体不同于中间容器,不能直接把组件加入到JInternalFrame中 ,而只能加到它的内容面板ContentPane中。内部窗体和JFrame窗体一样 ,可以通过getContentPane()方法得到它的内容窗体。 ? 为了能显示内部窗体,必须把内部窗体先添加到一个专门为内部窗 体服务的JDesktopPane容器中。 ? 内部窗体需设置初始大小,内部窗体的内容面板的默认布局是 BorderLayout布局。
? JOptionPane和JDialog对话框
– 对话框的模式与方法
? 对话框分为模式(Modal)和非模式(Non-modal)两种。
– 模式对话框:对话框程序必须确认才能继续运行; – 非模式对话框:显示对话框后,用户可以不用关闭此对话框就可继续 程序的运行。
School of Computer Science and Technology

? 构造方法:

JOptionPane()

创建一个带有测试消息的JOptionPane

JOptionPane(Object msg, int msgtype)

创建一个显示消息的JOptionPane的实例,使其 具有指定的消息类型和默认选项

JOptionPane(Object msg, int msgtype, int 创建一个显示消息的JOptionPane的实例,使其

optiontype, Icon icon)

具有指定的消息类型、选项和图标

JDialog()

创建一个没有标题并且没有指定Frame所有者的 无模式对话框

JDialog(Dialog owner, String str)

创建一个具有指定标题和指定所有者对话框的无 模式对话框

JDialog(Dialog owner, boolean model)

创建一个具有指定所有者 Dialog 和模式的对话 框

JDialog(Dialog owner, String str, boolean model) 创 建 一 个 具 有 指 定 标 题 、 模 式 和 指 定 所 有 者 Dialog的对话框

School of Computer Science and Technology

? 静态方法

showInputDialog(Object msg)

显示请求用户输入的问题消息对话框

showInputDialog(Component parentC, Object 显示请求用户输入内容的对话框,它以parentC

msg, String str, int msgtype)

为 父 级 , 该 对 话 框 的 标 题 为 str , 消 息 类 型 为

msgType

showMessageDialog(Component parentC, Object 调出信息为msg消息对话框 msg)

showMessageDialog(Component parentC, Object 调出对话框,它显示使用由msgType参数确定

msg, String str, int msgtype)

的默认图标的message

ShowConfirmDialog(Component parentC, Object 调出带有选项Yes、No和Cancel的对话框;标

msg)

题为Select an Option

ShowConfirmDialog(Component parentC, Object 调出一个由 optType 参数确定其中选项数的

msg, String str, int optType)

对话框

School of Computer Science and Technology

? 一般方法:

setSize()

设置对话框大小

setModal(boolean b)

设置对话框模式

getTitle()

获取对话框标题

setTitle(String title)

设置对话框标题

setVisible(boolean b)
– JOptionPane对话框

设置对话框是否可见

? 提供了多种可供用户使用的对话框以及相应的静态方法,指定该方 法中的有关参数就可以很容易的引用JOptionPane类赋予的对话框。

? JOptionPane对话框主要分为以下四种类型:

– ShowMessageDialog:用于向用户显示一些信息,含有“确定”按钮。 方法中的msgtype可以取以下值:
?JOptionPane.WARNING_MESSAGE ?JOptionPane.INFORMATION_MESSAGE ?JOptionPane.QUESTION_MESSAGE

School of Computer Science and Technology

?JOptionPane.ERROR_MESSAGE ?JOptionPane.PLAIN_MESSAGE 注意:以上这些值可以确定对话框的外观。
– ShowInputDialog:用于提示用户进行数据输入,通过返回一个确认/否 消息给系统以决定取舍。 – ShowOptionDialog:用于给出可供用户选择的对话框。 – ShowConfirmDialog:用于想用户提问一个要求确认的信息,并可得到 YES/NO/CANCEL的响应,方法中的msgtype可取以下值:
?JOptionPane.YES_NO_OPTION ?JOptionPane.OK_CANCEL_OPTION ?JOptionPane.YES_NO_CANCEL_OPTION
– 当对话框消失后,showConfirmDialog方法会返回下列整数值之一:
?JOptionPane.YES_OPTION ?JOptionPane.NO_OPTION ?JOptionPane.OK_OPTION ?JOptionPane.CANCEL_OPTION ?JOptionPane.CLOSED_OPTION
School of Computer Science and Technology

? 实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JOptionPaneEx extends JFrame{
private JButton b1,b2,b3,b4; public JOptionPaneEx(){
super("JOptionPane Example"); Container c=getContentPane(); c.setLayout(new GridLayout(2,2,20,20)); b1=new JButton("b1(Message)");c.add(b1);b1.addActionListener(new handle()); b2=new JButton("b2(Question)");c.add(b2);b2.addActionListener(new handle()); b3=new JButton("b3(Input)");c.add(b3);b3.addActionListener(new handle()); b4=new JButton("b4(Confirm)");c.add(b4);b4.addActionListener(new handle()); setSize(300,200); show(); } public class handle implements ActionListener{ public void actionPerformed(ActionEvent e){
String title="Dialog"; String content="Display the content of dialog"; int dialogType=JOptionPane.PLAIN_MESSAGE; if(e.getSource()==b1){
title="Message"; dialogType=JOptionPane.INFORMATION_MESSAGE; JOptionPane.showMessageDialog(null,content,title,dialogType); }
School of Computer Science and Technology

else if(e.getSource()==b2){ title="Question"; dialogType=JOptionPane.QUESTION_MESSAGE; JOptionPane.showMessageDialog(null,content,title,dialogType);
} else if(e.getSource()==b3){
title="Input"; dialogType=JOptionPane.QUESTION_MESSAGE; JOptionPane.showInputDialog(null,content,title,dialogType); } else{ title="Confirm"; dialogType=JOptionPane.YES_NO_OPTION; JOptionPane.showConfirmDialog(null,content,title,dialogType); } } } public static void main(String args[]){ JOptionPaneEx jp=new JOptionPaneEx(); } }
School of Computer Science and Technology

School of Computer Science and Technology

– JDialog对话框
? 如果JOptionPane提供的对话框无法满足我们的要求,就需要使用 JDialog来自行设计对话框。 ? JDialog类和JFrame类都是Window的子类,两者都依赖于某个窗口或 组件,都可以将相关组件添加到内容面板ContentPane中。当JDialog对 话框依赖的窗口或组件消失,对话框也消失;而当它所依赖的窗口或 组件可见时,对话框又会自动恢复。 ? 需要注意的是:
– 不可以直接将组件添加到JDialog对象中,而需要通过getContentPane方 法获得内容面板,然后将组件添加到内容面板中去; – 不可以对JDialog设置布局,而是为其内容面板设置布局,默认布局为 BorderLayout。
? 实例:
import java.awt.*; import java.awt.event.*; import javax.swing.*;
School of Computer Science and Technology

public class JDialogEx extends JFrame{ JLabel l1=new JLabel("please click yes or no button"); JLabel l2=new JLabel(" "); JButton b1=new JButton("display JDialog"); JButton b2=new JButton("yes"); JButton b3=new JButton("no"); private JDialog jd=new JDialog(); private JFrame jf; public JDialogEx(){ super("JDialog Example"); jf=new JFrame("JDialog"); Container c=getContentPane(); c.setBackground(Color.orange); c.setLayout(new GridLayout(2,1,20,20)); c.add(b1);c.add(l2); Container d1=jd.getContentPane(); d1.setLayout(new FlowLayout()); d1.add(l1);d1.add(b2);d1.add(b3); b1.addActionListener(new handle()); b2.addActionListener(new handle()); b3.addActionListener(new handle()); setSize(200,150); setVisible(true); }
School of Computer Science and Technology

public class handle implements ActionListener{ public void actionPerformed(ActionEvent e){ if(e.getSource()==b1){ jd.setBounds(150,150,200,150); jd.show(); } else if(e.getSource()==b2){ jd.hide(); l2.setText("You have selected yes button"); } else{ jd.hide(); l2.setText("You have selected no button"); } }
} public static void main(String args[]){
JDialogEx jde = new JDialogEx(); } }
School of Computer Science and Technology

多媒体程序设计

? Java屏幕坐标系
– 单位:像素
(0,0)

(80,0)

(0,50)

(80,50)

? Graphics主要方法

draw3DRect(int x, int y, int w, int h, boolean 绘 制 以 (x,y) 为 起 点 宽 高 为 w和 h的 3D 矩 形 , 当

raised)

raised为true时3D效果为凸

fill3DRect(int x, int y, int w, int h, boolean 填 充 以 (x,y) 为 起 点 宽 高 为 w和 h的 3D 矩 形 , 当

raised)

raised为true时3D效果为凸

drawLine(int x1, int y1, int x2, int y2)

画点(x1,y1)和点(x2,y2)之间的直线

drawRect(int x, int y, int w, int h)

绘制以(x,y)为起点宽高为w和h的矩形

School of Computer Science and Technology

fillRect(int x, int y, int w, int h)

填充以(x,y)为起点宽高为w和h的矩形

clearRect(int x, int y, int w, int h)

以背景色填充以(x,y)为起点宽高为w和h的矩形

drawRoundRect(int x, int y, int w, int h, int 绘制以(x,y)为起点宽高为w和h的圆角矩形,四个圆

arcW, int arcH)

角的宽度为arcW,高度为arcH

fillRoundRect(int x, int y, int w, int h, int 填充以(x,y)为起点宽高为w和h的圆角矩形,四个圆

arcW, int arcH)

角的宽度为arcW,高度为arcH

drawOval(int x, int y, int w, int h)

以(x,y)为起点、按宽高为w和h的外接矩形绘制椭圆

fillOval(int x, int y, int w, int h)

以(x,y)为起点、按宽高为w和h的外接矩形填充椭圆

drawArc(int x, int y, int h, int sAng, int 以sAng为起始角,arcAng为张角画圆弧或扇形,逆

arcAng)

时针为正

fillArc(int x, int y, int h, int sAng, int 以sAng为起始角,arcAng为张角填充圆弧或扇形,

arcAng)

顺时针为负

drawPolygon(int x[ ], int y[ ], int points)

按照x[]和y[]数组为定点绘制封闭的points边形

fillPolygon(int x[ ], int y[ ], int points)

按照x[]和y[]数组为定点填充封闭的points边形

School of Computer Science and Technology

? 图形处理

– 利用Graphics类提供的方法绘制图形

? 绘制直线 ? 绘制矩形 ? 绘制圆角矩形 ? 绘制3D矩形 ? 绘制椭圆 ? 绘制圆弧和扇形 ? 绘制多边形 ? 颜色
Color(int r, int g, int b) Color(float r, float g, float b) Color(int rgb)

创建具有指定红绿蓝值的不透明sRGB颜色,值范围为0-255
创建具有指定红绿蓝值的不透明sRGB颜色,值范围为0.0-1.0
创建具有指定组合的RGB值的不透明的sRGB 颜色,此 sRGB 值的16-23位表示红色分量,8-15位表示绿色分量,0-7位表 示蓝色分量

School of Computer Science and Technology

– 此外还有系统定义的13中颜色常量:
?WHITE / RED / GREEN / BLUE / GRAY / YELLOW / CYAN / BLACK / MAGENTA / PINK / DARKGRAY / LIGHTGRAY / ORANGE
? 文本字体设置

Font(String name, int style, int size)

根据指定名称、样式和磅值大小,创建一个新Font

setFont(Font font)

设置字体

getFont()

获取字体对象

getName()

获取字体的逻辑名字

getStyle()

获取字体字型

getSize()

获取字体大小

– 直接导入图形文件进行处理

? 声明Image类型的变量

– 通过java.awt下Component类的createImage()方法完成。

Image createImage(ImageProducer img)

使用指定的图像生成器创建一幅图像

Image createImage(int w, int h)

返回具有w宽h高的空图像

School of Computer Science and Technology

– java.awt.image包中提供类MemoryImageSource适用于在内存中生成一幅 图像。

MemoryImageSource(int w, int h, int pix[ ], int 在内存中生成一幅图像,其中pix[]代表图像

start, int scan)

每一点颜色值,start代表起始位置,scan代

表图像扫描线宽度

? 使用getImage()加载图像

getImage(URL url) getImage(URL url, String name)

获取url中的图像 获取指定url下文件name中的图像

getImage(URL url) getImage(String filename)

获取url中的图像 获取指定url下文件filename中的图像

? 使用drawImage()绘制图像

drawImage(Image img, int x, int y, ImageObserver 绘制指定图像中当前可用的图像 obs)

drawImage(Image img, int x, int y, int w, int h, 绘制指定图像中当前可用的图像,其中bg是在

Color bg, ImageObserver obs)

图像非透明部分下绘制的背景色

School of Computer Science and Technology

? 图像的缩放
– 当drawImage语句和原来图片显示的宽/高度不一样时,系统就自动进行 缩放处理。
? 图像旋转与透明处理
– awt包中提供了一个二维增强图像类Graphics2D,能够对图像及文本进行 旋转、透明等处理。 – 以2D方式进行处理,需要将绘图区转换为Graphics2d类型,然后调用其 方法完成; – 绘制透明图像时,需要设定图形交叉区的颜色合成模式,该模式由 AlphaComposite类生成,并由Graphics2D类设定。
? 声音处理

– 简单方式
play(URL url)
play(URL url, String name)

播放指定url的声音 播放指定url下声音文件name的声音

? 其中url表示声音文件的位置,一般用getCodeBase()或getDocumentBase()
代表。
School of Computer Science and Technology

– 可控制声音的播放
? 获取AudioClip对象:

getAudioClip(URL url)

从url获取AudioClip对象

getAudioClip(URL url, String name)

从url下声音文件name获取AudioClip对象

? AudioClip提供的三个方法:

– play():从头开始播放声音,只播放一次; – loop():循环播放 – stop():停止当前正在播放的声音

School of Computer Science and Technology

总结
step1.声明和创建我的窗口 创建继承自Jframe的类…… getContentPane() 大小、背景……
step3.哪些组件需要与用户交互 button.addActionListener() textfield.addActionListener() …… ……

step2.根据功能声明并排放组件

Button Label
TextField
……

Menu

step4.交互时应用程序作何响应
actionPerformed() valueChanged() …… ……

School of Computer Science and Technology



热文推荐
猜你喜欢
友情链接: 幼儿教育 小学教案 初中教案 高中教案 职业教育 成人教育