posts - 37, comments - 8, trackbacks - 0, articles - 0

java基础:GUI基础编程(上)

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(300400);//设置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);
            }

        }
);
    }

}

只有注册用户登录后才能发表评论。


网站导航: