|
Posted on 2008-08-08 06:58 梦与桥 阅读(1438) 评论(0) 编辑 收藏 所属分类: java基础
1、描述:图形用户界面是用户与计算机交互的接口,是图形界面成分和界面元素的有机会组合。这些成分和元素之间不但外观上有着包含、相邻、相交等物理关系,内在也有包含、调用等逻辑关系。它们相互作用,传递信息,共同组成一个能响应特定事件,具有一定功能的图形界面系统。
2、设计和实现图形用户界面的工作主要有两个:
(1)外观设计:创建组成界面的成分和元素,指定其属性和位置关系,并根据具体需要对它们进行排列,从而构成完整的图形用户界面的物理外观。
(2)与用户的交互处理:定义图形用户界面的事件和各界面元素对不同事件的响应,从而实现图形用户界面的用户交互功能。
3、Java构成图形用户界面的各种元素和成分大致分成三类:容器、基本组件、用户自定义成分
(1)容器:容器是用来组织其他界面成分和元素的单元,其引入有利于分解图形用户界面的复杂性,当界面的功能较多时,使用层层相套的容器是非常必要的。容器的主要作用和特点:容器有一定的范围(高和宽决定)、容器有一定的位置(绝对位置和相对位置)、容器通常都有一个背景、同一容器中的成分将同时被显示或隐藏(这是安排容器元素的重要依据)、容器可以按一定的规则来物理地安排其所包含的元素、容器可以用来完成某种交互功能、容器也可被包含在其他容器之中。
(2)基本组件:完成与用户的一次交互,包括接收用户的命令,接收用户的文本或选择输入,向用户显示文本或图形等。目前常用组件:标签(显示信息)、命令按钮(对应特定功能)、文本编辑区(接受用户输入并具有一定的编辑功能)、单选按钮(多选一)、复选框(二选一)、组合框(多选一或多选多)、菜单。
(3)用户自定义的成分:编程人员根据需要而设计,但不能像标准界面元素一样被系统识别和承认,因此通常只能起到装饰和美化等作用,而不能响应用户的动作,不具有交互功能。
4、JavaGUI的组成:
(1)java.awt包:AWT是一个抽象的工具集,因为Java程序的图形用户界面在不同的平台上可能出现不同的运行效果,其外观取决于具体的平台。
AWT中的类按其功能分为五类:
§基本GUI组件类:Label(标签)、TestField(单行文本框)、TextArea(多行文本域)、Button(按钮)、Checkbox(复选框)、List(列表)、Canvas(画布)、Menu(菜单)和Scrollbar(滚动条)等。类java.awt.Component是许多组件类的父类,封装了组件通用的方法和属性,用于外观控制等。
§容器类(Container):常用的三个主要类型有窗口(Window)、面板(Panel)和Applet。Window是java.awt.Window的对象,显示屏上独立的本机窗口,主要包括框架(Frame)和对话框(Dialog)。
§布局管理类:流布局管理器(FlowLayout是Panel和Applet默认布局管理器)、边界布局管理器(BorderLayout)、网格布局管理器(GridLayout)、卡片布局管理器(CardLayout)、网格袋布局管理器(GridBagLayout)、盒式布局管理器(BoxLayout)、空布局管理器(null)。容器里组件的位置和大小是由布局管理器决定的,每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。
§事件处理类:JDK1.1及其以后的版本中,AWT采用委托事件模型进行事件处理,委托事件模型包括事件源、事件和事件监听器。
§基本图形类:字体类(Font)、绘图类(Graphics)、图像类(Image)、颜色类(Color)等。用以构造图形界面的类。
(2)java.swing包:Swing在AWT基础上构建,功能更强大和灵活,与AWT不同的是,Swing组件不是由特定的平台代码实现,而是纯粹的java代码实现的,因此能够实现与平台的无关(此类组件一般称为轻量级组件)。Swing采用MVC(模型—视图—控制)的设计范式,使java程序在一平台上运行时能够有不同外观以供用户选择。
Swing中的类按其功能分为六类:
§顶层容器:JFrame、JApplet、JDialog和JWindow;
§中间容器:JPanel、JScrollPane、JSplitPane和JToolBar;
§特殊容器:JInternalFrame、JLayerPane和JRootPane;
§基本组件:JButton、JComboBox、JList、JMenu、JSlider和JTextField
§不可编辑信息组件:JLabel、JProgressBar和ToolTip
§可编辑信息组件:JColorChooser、JFileChooser、JTable和JTextArea
Swing中的JComponent类,提供了一些设置组件的方法:使用setBorder()方法设置组件外围边框、使用setDoubleBuffered()方法设置双缓冲技术能改进频繁变化的组件显示效果、使用setToolTipText()方法为组件设置工具提示文本等。 Swing中的JComponent类,提供了一些设置组件的方法:使用setBorder()方法设置组件外围边框、使用setDoubleBuffered()方法设置双缓冲技术能改进频繁变化的组件显示效果、使用setToolTipText()方法为组件设置工具提示文本等。
Swing程序设计的一般流程:引入java.swing包、选择“外观和感觉”、设置顶层容器、设置基本组件、向容器中添加组件、在组件周围添加边界、进行事件处理。
Swing组件与AWT相比较所具有的优势:
§Swing的按钮和标签可以显示图像,而在AWT只能显示文本。
§可以很容易地增加或改变大多数Swing组件的边界。
§通过Swing组件的方法或创建一个子类,可以很容易地改变Swing组件的行为和外观。
§Swing组件可以不是矩形,例如按钮可以是椭圆形。
§Accessibility技术(例如触摸屏)可以很容易地从Swing组件得到信息。
§真正做到了与平台无关。
5 、一个awt实例(仅外观设计):
import java.awt.*;
import java.awt.event.*;
public class frame {
public static void main(String[] args) throws Exception{
Frame fr=new Frame("awt演示程序");//构造Frame对象
CardLayout cla=new CardLayout();//定义卡片布局引用
fr.setSize(300, 400);//设置Frame大小
fr.setLayout(cla);//设置Frame布局方式
MenuBar mb=new MenuBar();//构建MenuBar
Menu mson=new Menu("选择");//构建Menu对象mson
mson.add("选择一个字符");//添加菜单项
mson.add("选择一个单词");
mson.add("选择整行");
mson.add("选择整段");
mson.add("全选");
Menu m=new Menu("编辑");
m.add("复制");
m.add("剪切");
m.add("粘贴");
m.addSeparator();//添加分隔符
m.add("替换");
m.add("查找");
m.add(mson);
mb.add(m);//将菜单添加到菜单栏
Card1 c1=new Card1();//卡片1
Card2 c2=new Card2();//卡片2
Card3 c3=new Card3();//卡片3
fr.setMenuBar(mb);//frame对象添加菜单栏
fr.add(c1, "c1");//添加卡片
fr.add(c2, "c2");
fr.add(c3,"c3");
fr.addWindowListener(new WindowAdapter(){//添加Window事件,以能退出程序
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
fr.setResizable(false);//用户不可设置frame对象尺寸
fr.setVisible(true);//显示frame对象
while(true){//循环显示卡片
Thread.sleep(5000);//当前线程休眠50000毫秒
cla.next(fr);
}
}
}
//类Card1
class Card1 extends Panel{
private Label la1,la2;
private Button bt1,bt2;
private TextField tf1,tf2;
private TextArea ta;
private Panel p;
public Card1(){
setSize(300,400);
setLayout(new BorderLayout(5,10));
la1=new Label("标签、按钮、文本框和多行文本框的演示",Label.CENTER);
la2=new Label();
la2.setText("版权所有:梦与桥");
la2.setAlignment(Label.CENTER);
la2.setBackground(Color.gray);
bt1=new Button("提交");
bt2=new Button("重置");
tf1=new TextField("文本框");
tf2=new TextField("密码框");
tf2.setEchoChar('*');//设置回显字符
ta=new TextArea(10,40);
ta.setText("多行文本框,此处设置的是10行,40列。");
p=new Panel();
p.setLayout(new FlowLayout(FlowLayout.CENTER,38,10));
p.setBackground(Color.yellow);//设置背景颜色
p.add(tf1);
p.add(tf2);
p.add(ta);
p.add(bt1);
p.add(bt2);
add(la1,BorderLayout.NORTH);
add(la2,BorderLayout.SOUTH);
add(p,BorderLayout.CENTER);
}
}
//类Card2
class Card2 extends Panel{
private Label la1,la2,la3,la4,la5,la6;
Checkbox cb1,cb2,cb3,cb4,cb5,cb6;
CheckboxGroup cbg;
Choice c1;
List l1;
private Panel p,p1,p2,p3,p4;
public Card2(){
setSize(300,400);
setLayout(new BorderLayout(5,10));
la1=new Label("复选框、单选框、下拉列表、列表的演示",Label.CENTER);
la2=new Label();
la2.setText("版权所有:梦与桥");
la2.setAlignment(Label.CENTER);
la2.setBackground(Color.gray);
la3=new Label("复选框:");
la4=new Label("单选框:");
la5=new Label("下拉列表:");
la6=new Label("列表:");
cb1=new Checkbox("体育",true);
cb2=new Checkbox("文学");
cb3=new Checkbox();
cb3.setLabel("计算机");
cb3.setState(true);
p1=new Panel();
p1.add(la3);
p1.add(cb1);
p1.add(cb2);
p1.add(cb3);
cbg=new CheckboxGroup();
cb4=new Checkbox("北京",cbg,false);
cb5=new Checkbox("上海",cbg,true);
cb6=new Checkbox();
cb6.setLabel("双阳");
cb6.setCheckboxGroup(cbg);
cb6.setState(false);
p2=new Panel();
p2.add(la4);
p2.add(cb4);
p2.add(cb5);
p2.add(cb6);
c1=new Choice();
c1.add("one");
c1.add("three");
c1.insert("two", 1);
c1.select(2);
p3=new Panel();
p3.add(la5);
p3.add(c1);
l1=new List();
l1.add("one");
l1.add("two");
l1.add("three");
l1.add("four");
l1.setMultipleMode(true);
l1.select(1);
l1.select(2);
p4=new Panel();
p4.add(la6);
p4.add(l1);
p=new Panel();
p.setLayout(new FlowLayout(FlowLayout.LEFT,38,10));
p.add(p1);
p.add(p2);
p.add(p3);
p.add(p4);
p.setBackground(Color.magenta);
add(la1,BorderLayout.NORTH);
add(la2,BorderLayout.SOUTH);
add(p,BorderLayout.CENTER);
}
}
//类Card3
class Card3 extends Panel{
private Label la1,la2,la3,la4;
private Scrollbar sb1,sb2,sb3,sb4;
private Canvas c;
private Panel p,p1,p2,p3;
public Card3(){
setSize(300,400);
setLayout(new BorderLayout(5,10));
la1=new Label("滚动条、画布的演示",Label.CENTER);
la2=new Label();
la2.setText("版权所有:梦与桥");
la2.setAlignment(Label.CENTER);
la2.setBackground(Color.gray);
la3=new Label("滚动条:");
la4=new Label("画板:");
sb1=new Scrollbar();
sb2=new Scrollbar(Scrollbar.VERTICAL);
p1=new Panel();
p1.add(sb1);
p1.add(sb2);
p=new Panel();
sb3=new Scrollbar(Scrollbar.HORIZONTAL);
sb4=new Scrollbar(Scrollbar.HORIZONTAL,400,200,100,5000);
p2=new Panel();
p2.add(la3);
p2.add(sb3);
p2.add(sb4);
c=new Canvas();c.setSize(200,160);
p3=new Panel();
p3.add(la4);
p3.add(c);
p3.setBackground(Color.white);
p.setLayout(new FlowLayout(FlowLayout.CENTER,38,10));
p.setBackground(Color.yellow);
p.add(p1);
p.add(p2);
p.add(p3);
add(la1,BorderLayout.NORTH);
add(la2,BorderLayout.SOUTH);
add(p,BorderLayout.CENTER);
}
}
6、Swing基本组件:JLabel、JTextField、JButton、JFrame和JPanel构造应用程序
import javax.swing.*;
public class LoginDemo extends JFrame{
//声明组件
JLabel lblTitle,lblUser,lblPass;
JTextField txtUser;
JPasswordField pwdPass;
JButton btnLogin,btnExit;
JPanel pnlMain;
//构造方法
public LoginDemo(){
super("用户登录");
pnlMain=new JPanel();
this.getContentPane().add(pnlMain);
//实例化组件
String address="G:\\00\\images\\";
lblTitle=new JLabel(new ImageIcon(address+"welcome.gif"));
lblUser=new JLabel("用户名:");
txtUser=new JTextField(12);
lblPass=new JLabel("密码:");
pwdPass=new JPasswordField(12);
//"登录"按钮
Icon imgLogin=new ImageIcon(address+"login.gif");
btnLogin=new JButton("登录(L)",imgLogin);
btnLogin.setMnemonic('L');//键盘助记符
btnLogin.setToolTipText("点击登录");//工具提示文字
//"退出"按钮
Icon imgExit=new ImageIcon(address+"exit.gif");
btnExit=new JButton("退出(x)",imgExit);
btnLogin.setMnemonic('X');
btnExit.setToolTipText("退出登录");
//添加组件到面板
pnlMain.add(lblTitle);
pnlMain.add(lblUser);
pnlMain.add(txtUser);
pnlMain.add(lblPass);
pnlMain.add(pwdPass);
pnlMain.add(btnLogin);
pnlMain.add(btnExit);
//设置窗口属性
setSize(450,400);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new LoginDemo();
}
}
7、 单选按钮(JRadioButton)、复选框(JCheckbox)、列表框(JList)、组合框(JComboBox)编程演示:
import javax.swing.*;
import java.awt.*;
public class FontDemo extends JFrame{
JPanel pnlMain;
JLabel lblSize,lblType,lblTest;
JRadioButton rbtnRed,rbtnGreen;
JCheckBox chkBold,chkItalic;
JButton btnExit;
ButtonGroup grpColor;
List lstSize;
JComboBox cmbType;
String[] strType={"宋体","隶书","楷体_GB2312","仿宋_GB2312"};
public FontDemo(){
super("字体设置器");
lblType=new JLabel("请选择字体");
lblSize=new JLabel("请选择字形");
//使用List构造字形选择列表
lstSize=new List();
for(int i=10;i<30;i+=2)
lstSize.add(String.valueOf(i));
lstSize.select(0);
//使用JComboBox和StrType构造字体选择组合框
cmbType=new JComboBox(strType);
cmbType.setSelectedIndex(0);
//使用JRadioButton构造字体颜色选择单选按钮
grpColor=new ButtonGroup();
rbtnRed=new JRadioButton("红色");
grpColor.add(rbtnRed);
rbtnRed.setSelected(true);
rbtnGreen=new JRadioButton("绿色");
grpColor.add(rbtnGreen);
//使用JCheckBox构造字体效果选择复选框
chkBold=new JCheckBox("加粗");
chkItalic=new JCheckBox("倾斜");
lblTest=new JLabel("这是字体设置的测试文字");
//创建一个指定类型的斜面边框
lblTest.setBorder(BorderFactory.createBevelBorder(1));
btnExit=new JButton("退出");
//布局组件
pnlMain=new JPanel();
pnlMain.add(lblType);
pnlMain.add(cmbType);
pnlMain.add(lblSize);
pnlMain.add(lstSize);
pnlMain.add(rbtnRed);
pnlMain.add(rbtnGreen);
pnlMain.add(chkBold);
pnlMain.add(chkItalic);
pnlMain.add(lblTest);
pnlMain.add(btnExit);
this.setContentPane(pnlMain);//将面板设置为Frame的容器
this.setSize(250,200);
this.setVisible(true);
}
public static void main(String[] args) {
new FontDemo();
}
}
8、文本域(JTextArea)、菜单(JMenuBar、JMenu、JMenuItem)和工具栏(JToolbar)程序演示
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
public class NotepadDemo extends JFrame{
JMenuBar mbMain;
JMenu mnuSystem,mnuHelp;
JMenuItem mnuiNew,mnuiSave,mnuiOpen,mnuiExit,mnuiContent,mnuiIndex,mnuiAbout;
public NotepadDemo(){
super("小小记事本");
mbMain=new JMenuBar();
mnuSystem=new JMenu("文件(F)");
mnuHelp=new JMenu("帮助(H)");
mnuSystem.setMnemonic('F');
mnuHelp.setMnemonic(KeyEvent.VK_H);
mbMain.add(mnuSystem);
mbMain.add(mnuHelp);
mnuiNew=new JMenuItem("新建");
mnuiOpen=new JMenuItem("打开");
mnuiSave=new JMenuItem("保存");
mnuiExit=new JMenuItem("退出");
mnuSystem.add(mnuiNew);
mnuSystem.add(mnuiSave);
mnuSystem.add(mnuiSave);
mnuSystem.add(mnuiExit);
Icon icnContent=new ImageIcon("help.gif");
mnuiContent=new JMenuItem("目录",icnContent);
mnuiIndex=new JMenuItem("索引");
mnuiAbout=new JMenuItem("关于[Notepad]");
mnuHelp.add(mnuiContent);
mnuHelp.add(mnuiIndex);
mnuHelp.add(mnuiAbout);
setJMenuBar(mbMain);
//构造工具栏
JToolBar tb=new JToolBar();
//添加按钮到工具栏
JButton btnNew=null;
btnNew=makeButton("new","NEW","新建一个文件","新建");
tb.add(btnNew);
JButton btnOpen=null;
btnOpen=makeButton("open","OPEN","打开一个文件","打开");
tb.add(btnOpen);
JButton btnSave=null;
btnSave=makeButton("save","SAVE","保存一个文件","保存");
tb.add(btnSave);
JPanel pnlMain=new JPanel(new BorderLayout());
setContentPane(pnlMain);
pnlMain.add(tb,BorderLayout.PAGE_START);
setSize(250,150);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//构造工具栏按钮方法
private JButton makeButton(String strImage, String strAction, String txtToolTip,
String strAlter) {
//搜索图片
String imgLocation=strImage+".gif";
URL urlImage=NotepadDemo.class.getResource(imgLocation);
//初始化工具按钮
JButton btnTemp=new JButton();
//设置按钮的命令
btnTemp.setActionCommand(strAction);
//设置提示信息
btnTemp.setToolTipText(txtToolTip);
if(urlImage!=null)//找到图像
btnTemp.setIcon(new ImageIcon(urlImage));
else //没有图像
btnTemp.setText(strAlter);
return btnTemp;
}
public static void main(String[] args) {
new NotepadDemo();
}
}
8、颜色(Color)和字体(Font)程序演示 :
import java.awt.*;
import javax.swing.*;
public class ColorFontDemo extends JFrame{
JLabel lblTitle,lblHead;
JPanel pnlMain;
Font fn1=new Font("宋体",Font.ITALIC,20);
Font fn2=new Font("楷体",Font.ITALIC+Font.BOLD,18);
Color cl=new Color(20);
public ColorFontDemo(){
lblTitle=new JLabel("吉林农业大学发展学院");
lblHead=new JLabel("计算机学院05软件");
pnlMain=new JPanel();
lblTitle.setFont(fn1);
lblTitle.setForeground(Color.RED);
lblHead.setFont(fn2);
lblHead.setForeground(cl);
this.getContentPane().add(pnlMain);
pnlMain.add(lblTitle);
pnlMain.add(lblHead);
setSize(300,150);
setVisible(true);
setTitle("颜色字体演示");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ColorFontDemo();
}
}
9、一个使用JTable的例子:
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.*;
public class GuiTest extends JFrame
{
private JTable table;
private String data[][];
public static void main(String args[])
{
GuiTest gt=new GuiTest();
//pack()是java.awt.Window的方法
//调整此窗口的大小,以适合其子组件的首选大小和布局。
gt.pack();
gt.setVisible(true);
}
public GuiTest()
{
String columnNames[]={"姓名","计算机","英语","平均分"};
data=new String[][]{{"小一","90.0","60.0","75.0"},{"小二","90.0","80.0","85.0"}
,{"小三","100.0","80.0","90.0"}};
table=new JTable(data,columnNames);
//设置某个表视区的首选大小
//java.awt.Dimension封闭单个单个对象中组件的宽度和高度(精确到整数)
table.setPreferredScrollableViewportSize(new Dimension(300,100));
JScrollPane tablePane=new JScrollPane(table);
setTitle("表格的使用");
Container c=getContentPane();
c.add(tablePane,BorderLayout.CENTER);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//设置为单选
//接口 ListSelectionModel表示任何组件的当前选择状态
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//接口 TableModel指定了 JTable 用于询问表格式数据模型的方法
TableModel mod=table.getModel();
//每当数据模型发生更改时,就将一个侦听器添加到被通知的列表中
//TableModelListener 定义侦听 TableModel 中更改的对象的接口
mod.addTableModelListener(new TableModelListener()
{
public void tableChanged(TableModelEvent e)
{
int row=e.getFirstRow();
float num,sum=0;
for(int i=1;i<=2;i++)
{
num=Float.parseFloat((String)table.getValueAt(row,i));
sum=sum+num;
}
float average=sum/2;
data[row][3]=Float.toString(average);
}
});
}
}
|