转自:http://www.blogjava.net/haizhige/archive/2008/08/08/220808.html
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()方法设置双缓冲技术能改进频繁变化的组件显示效果、使用
Swing中的JComponent类,提供了一些设置组件的方法:使用setToolTipText()方法为组件设置工具提示文本等。
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);
- }
- });
- }
- }