JAVA--图形界面化

本文详细介绍了JAVA中的图形界面组件,包括Component、Container及其子类如Window、Panel、Dialog,以及Button、Label、Checkbox、TextArea和TextField等。文章还讲解了如何设置窗体的大小、位置和背景色,以及如何使用按钮组件。进一步地,文章探讨了事件监听机制,包括事件源、事件、监听器和处理方法,并提供了添加鼠标和键盘事件监听的示例。最后,提到了菜单栏、菜单和菜单项的创建,以及FileDialog的使用,帮助读者全面理解JAVA图形界面的构建和交互。

图形界面继承体系

Component
所有图形界面超类 抽象类,具有图形表示能力的类

Container
容器: 就是可以将对象存储进去
存储的是图形界面上的内容,菜单,按钮,文本框

Container子类
Window – 窗体 无边框的窗体
Frame – 具有标题和边框的窗体
Panel – 面板 窗体分割可以存储按钮容器
Dialog – 对话框,小的窗体,进行信息的提示
FileDialog – 文件对话框

Button 按钮
Label 文本标签 信息提示使用
checkbox 复选框
TextArea 多行文本区域

TextField 单行文本区域

java.awt.Frame 带有标题和边框的窗口
构造方法
Frame(String title)传递字符串的标题
显示窗体容器,调用Frame类的父类方法
setVisible(boolean b)传递true,就显示

对窗体进行设置
大小尺寸 父类方法 setSize(int width,int height) 数据单位像素
像素: 组成图像中最小的不可分割的实心小点

屏幕定位 父类方法 setLocation(int x,int y) X轴坐标,Y纵轴坐标
获取屏幕分辨率
Toolkit static Toolkit getDefaultToolkit() 返回的是类的子类对象
Toolkit.getDefaultToolKit().getScreenSize().width 返回是Dimension

设置窗体背景色
父类方法 setBackground

/*
 * 使用Frame类,实现图形界面
 * 图形界面,是另一个线程在控制
 */

public class FrameDemo {
    public static void main(String[] args) {
        //创建Frame对象,写字符串标题
        Frame f = new Frame("第一个窗体");
        //父类方法setVisible
        f.setVisible(true);

        //获取屏幕分辨率
        int h = Toolkit.getDefaultToolkit().getScreenSize().height;
        int w = Toolkit.getDefaultToolkit().getScreenSize().width;

        //尺寸设置,父类方法 setSize
        f.setSize(500, 400);
        //屏幕位置,父类方法 setLocation
        f.setLocation((w-500)/2, (h-400)/2);

        //设置背景色,父类方法setBackground
        f.setBackground(new Color(202,232,207));
    }
}

======================================================

按钮组件的使用
Button类
构造方法 Button(String label) 传递字符串的标签,标签就是按钮上写的字
设置位置,和尺寸的方式,和Frame窗体是一样
将按钮添加到窗体,使用的是窗体的方法add


/*
 * 按钮,添加到窗体上 
 */
public class FrameDemo1 {
   public static void main(String[] args) {

        Frame f = new Frame("窗体添加按钮");
        f.setVisible(true);

        int h = Toolkit.getDefaultToolkit().getScreenSize().height;
        int w = Toolkit.getDefaultToolkit().getScreenSize().width;

        f.setSize(500, 400);
        f.setLocation((w-500)/2, (h-400)/2);

        f.setBackground(new Color(202,232,207));

        //设置布局管理,null 取消所有布局管理
        //组件位置,可以任意放置,必须要定位和尺寸
        f.setLayout(null);
        //创建按钮对象
        Button but = new Button("确定");
        Button but1 = new Button("取消");
        //按钮添加到窗体中,窗体方法add
        f.add(but,BorderLayout.WEST);
        f.add(but1,BorderLayout.EAST);

        but.setSize(100, 30);
        but1.setSize(100, 30);
        but.setLocation(150, 50);
        but1.setLocation(280, 50);
}
}

=======================================================
事件监听机制
作用: 让图形界面,有一定功能产生,根据用户的实际操作,产生不同的功能

事件源:
就是用户可以直接操作的部分, 按钮,文本框,窗体,菜单

事件:
用户的操作方式, 鼠标,键盘,窗体事件
鼠标: 点击 鼠标悬停,离开
键盘: 按下 弹起
窗体: 打开 退出 最大最小

监听器: 类似于窃听器
一旦开始工作,就不停,工作在事件源上,事实监听用户的操作
只要用户操作了事件源,用户的动作就会被事件监听器抓住
根据不同的动作处理这个事件

处理方式:
就是程序中的方法,监听器会根据用户的动作不同,选择调用方法
a(){} b(){} c(){}

点击窗体上的叉子,窗体关闭
事件源: 窗体
事件: 关闭
监听器: 作用在窗体上监听器,监听用户对窗体的操作
点击的内容,调用处理方法
a(){} b(){}

/*
 * 事件监听机制,实现点击窗体上叉子,关闭窗体
 */

public class FrameDemo2 {
    public static void main(String[] args) {
        Frame f = new Frame("窗体关闭事件");
        f.setBounds(200, 100, 500, 400);
        f.setVisible(true);

        //事件源,窗体,添加事件监听器
        // addWindowListener
        //传递接收事件的接口的实现类对象,重写接口方法
        //方法,监听器根据用户的操作,自行调用
        //简化成了匿名的内部类实现,new 适配器类
        /*f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });*/
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
    }
}

//简化书写,自定义定义实现类,做接口的空实现
//没有抽象方法的抽象类,接口的适配器类  
//220V  电源适配器   -> 3.7  把你插座不想要的220V,变成你想要的3.7V
//抽象类,将接口中,不想要的方法,适配你想要的方法
//WindowAdapter 类的源代码  My 是一样的
/*abstract class My implements WindowListener{
    public void windowActivated(WindowEvent e) {}
    public void windowClosed(WindowEvent e) {}
    public void windowClosing(WindowEvent e) {}
    public void windowDeactivated(WindowEvent e){} 
    public void windowDeiconified(WindowEvent e) {}
    public void windowIconified(WindowEvent e) {}
    public void windowOpened(WindowEvent e) {}  
}*/

/*
 * 自定义WindowListener实现类
 */
/*class MyListener extends WindowAdapter{
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

}*/

最终版本的
写图形界面事件监听器的标准公式
导入 awt awt.event
事件源.addXXXListener(new XXXAdapter(){
public void EEE(XXXEvent e){
}
});

but.addMouseListener(new MouseAdater(){
public void MouseClicked(MouseEvent e){

 }

});

================================================
鼠标事件,调用事件处理方法中, MouseEvent类
int getClickCount() 鼠标的在事件源上的点击次数

/*
 * 鼠标事件
 *   按钮添加鼠标事件,点击,鼠标的悬停,鼠标离开
 */

public class FrameDemo3 {
    public static void main(String[] args) {
        Frame f = new Frame("按钮的鼠标事件");
        f.setVisible(true);

        int h = Toolkit.getDefaultToolkit().getScreenSize().height;
        int w = Toolkit.getDefaultToolkit().getScreenSize().width;

        f.setSize(500, 400);
        f.setLocation((w-500)/2, (h-400)/2);

        f.setBackground(new Color(202,232,207));

        f.setLayout(null);
        //创建按钮对象
        Button but = new Button("确定");
        but.setSize(100, 30);
        but.setLocation(150, 50);
        f.add(but);

        //对事件源按钮,添加事件监听器,鼠标事件
        but.addMouseListener(new MouseAdapter() {
            //重写鼠标的点击调用方法
            //MouseEvent类对象,是事件监听器调用方法自动传递
            //鼠标信息,点击位置(按钮,屏幕)按下的键位1左键,2是滚轮,3是右键,点击次数
            public void mouseClicked(MouseEvent e){
                //调用MouseEvent类方法getClickCount方法获取鼠标点击次数
                if(e.getClickCount()==2){
                    System.out.println("双击");
                }
            }

            //鼠标移入时调用,悬停状态
            public void mouseEntered(MouseEvent e) {
                System.out.println("鼠标移入到按钮");
            }

            //鼠标离开时调用
            public  void mouseExited(MouseEvent e) {
                System.out.println("鼠标离开按钮");
            }

        });

    }
}

单行文本
java.awt.TextField 表示可以编辑的单行文本
构造方法
空参数,文本框没有任何内容
传递字符串参数,文本框就会显示出,字符串

位置尺寸设置和Frame一样 setBounds
窗体容器add
String getText() 获取文本框内容,不写内容,返回的是 “”
void setText() 设置文本框内容

多行文本
java.awt.TextArea 表示可以编辑的多行文本
构造方法
空参数,文本框没有任何内容
传递字符串参数,文本框就会显示出,字符串

/*
 * 数据转移
 *   文本框,单行文本  TextField
 *   多行文本区域,可以换行  TextArea
 * 在单行文本框,键盘键入内容,点击按钮,文本内容,从单行文本转移到多行中
 */

public class FrameDemo4 {
    public static void main(String[] args) {
        Frame f = new Frame("文本数据转移");
        f.setVisible(true);
        int h = Toolkit.getDefaultToolkit().getScreenSize().height;
        int w = Toolkit.getDefaultToolkit().getScreenSize().width;
        f.setSize(500, 400);
        f.setLocation((w-500)/2, (h-400)/2);
        f.setBackground(new Color(202,232,207));
        f.setLayout(null);

        //创建单行文本框
        final TextField tf = new TextField();
        //设置
        tf.setBounds(40, 50, 300, 25);
        f.add(tf);

        //创建按钮
        Button but = new Button("数据转移");
        but.setBounds(380, 50, 60, 25);
        f.add(but);

        //创建多行文本框
        final TextArea ta = new TextArea();
        ta.setBounds(40, 90, 300, 200);
        f.add(ta);
    //  ta.setFont(new Font("宋体",Font.BOLD,15));

        //按钮,添加鼠标事件
        but.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e){
                //获取文本框内容
                String text = tf.getText();
                if("".equals(text))
                    return ;
                /*String os = System.getProperties().getProperty("os.name");
                System.out.println(os);
                String line = null;
                if(os.startsWith("W"))
                    line = "\r\n";
                else
                    line = "\n";*/
                //将文本,设置到多行文本区域
                ta.append(text+"\r\n");
                //清空单行文本
                tf.setText("");
            }
        });




        //窗体事件,程序关闭
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e){System.exit(0);}
        });
    }
}

=====================================================
获取用户的按键,需要ASCII码,键盘上的键很多
KeyEvent 描述按下键盘后信息
KeyEvent 静态成员变量 ,需要的ASCII码
静态变量,变量名就是键盘上的键的名字,保存的数值就是这个键的码值

KeyEvent类方法
int getKeyCode 返回按下键的ASCII
char getKeyChar 返回按下键的字符

KeyEvent类的父类方法 consume()终止当前事件
KeyEvent类的父类方法可以判断按下的特殊键盘
isAltDown boolean isControlDown()

/*
 *  键盘事件,文本框
 *    捕获到按下的键
 *    阻止非法键
 *    组合键 Ctrl+Enter
 */

public class FrameDemo5 {
    public static void main(String[] args) {
        Frame f = new Frame("键盘事件");
        f.setVisible(true);
        int h = Toolkit.getDefaultToolkit().getScreenSize().height;
        int w = Toolkit.getDefaultToolkit().getScreenSize().width;
        f.setSize(500, 400);
        f.setLocation((w-500)/2, (h-400)/2);
        f.setBackground(new Color(202,232,207));
        f.setLayout(null);

        //创建单行文本框
        TextField tf = new TextField();
        //设置
        tf.setBounds(40, 50, 300, 25);
        f.add(tf);

        //事件源文本框,添加键盘事件
        tf.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e){
                //获取到键盘上ASCII码
                int code = e.getKeyCode();
                //判断code范围是不是数字
            /*  if(code < KeyEvent.VK_0 || code > KeyEvent.VK_9){
                    e.consume();
                }*/

                //Ctrl+Enter的组合键
                //父类方法  isControlDown() 判断回车键
                if(e.isControlDown() && code == KeyEvent.VK_ENTER){
                    System.out.println("组合键");
                }

            }
        });
    }
}

======================================================

图形界面上的菜单
MenuBar 菜单栏
Menu 菜单
MenuItem 菜单项

创建菜单栏对象
MenuBar 构造方法,空参数
菜单添加到窗体上, 使用的是窗体方法setMenuBar

创建菜单对象
Menu 构造方法,传递字符串,显示菜单上
MenuBar方法add添加菜单

创建菜单项
MenuItem 构造方法,传递字符串,显示菜单项上
Menu类的方法add添加菜单

MenuItem 才能添加事件,活动事件

子菜单,一个Menu.add(另一个Menu)

public class MenuDemo {
    public static void main(String[] args) {
        Frame f = new Frame("制作菜单");
        f.setBounds(200, 100, 500, 300);
        f.setVisible(true);
        //创建菜单栏
        MenuBar bar = new MenuBar();
        //创建方法setMenuBar
        f.setMenuBar(bar);

        //创建菜单
        Menu newMenu = new Menu("新建");
        Menu editMenu = new Menu("编辑");

        //菜单栏add添加菜单
        bar.add(newMenu);
        bar.add(editMenu);

        //创建菜单项
        MenuItem java = new MenuItem("java");
        MenuItem c    = new MenuItem("c语言");

        MenuItem copy = new MenuItem("复制");
        MenuItem paste = new MenuItem("粘贴");

        //菜单项添加到菜单里  菜单方法add
        newMenu.add(java);
        newMenu.add(c);
        editMenu.add(copy);
        editMenu.add(paste);

        //添加菜单 HTML Menu
        Menu html = new Menu("HTML");
        //添加菜单项
        MenuItem css = new MenuItem("CSS");
        MenuItem js = new MenuItem("javascript");

        newMenu.add(html);
        html.add(css);
        html.add(js);


        //java菜单,添加活动监听
        java.addActionListener(new ActionListener() {   

            public void actionPerformed(ActionEvent e) {
                System.out.println("#########");
            }
        });

    }
}

=========================================

文件对话框 FileDialog
FileDialog打开文件对话框,用户可以从中选择文件
文件对话框,不是独立存在
构造器 FileDialog(Frame parent, String title, int mode)

String getDirectory()
获取此文件对话框的目录。
String getFile()
获取此文件对话框的选定文件。

这个知识点比较杂乱,只有多多熟悉猜好办,上几个自己写的列子~~!


public class Demo {
    public static void main(String[] args) {
        //创建窗口视图
        //随即数
        final Random r = new Random();
        final Frame f = new Frame("qw");
        f.setBounds(200, 100, 500, 400);
        f.setVisible(true);
        //设置严肃
        //f.setBackground(Color.getHSBColor(202, 112, 211));
        f.setLayout(null);
        Button but = new Button("变色龙,请点我");
        but.setBounds(300, 170, 85, 40);
        f.add(but);
        but.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {

                int x = r.nextInt(200);                                     
                int y = r.nextInt(200);                                     
                int z = r.nextInt(200);                                     
                f.setBackground(Color.getHSBColor(x, y, z));
                System.out.println(x+"--"+y+"--"+z);
                System.out.println("-----------------------");

            }   

//          public void mouseExited(MouseEvent e) {
//              int x = r.nextInt(200);                                     
//              int y = r.nextInt(200);                                     
//              int z = r.nextInt(200);                                     
//              f.setBackground(Color.getHSBColor(x, y, z));
//              System.out.println(x+"--"+y+"--"+z);
//          }

        });

        //窗口监视
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
    }
}

/*
 * 
 * MenuBar, //菜单栏
 * Menu,//菜单
 * MenuItem//菜单项

 */
public class Demo {
    public static void main(String[] args) {
        //创建一个窗口 
        final Frame f = new Frame("qixin");
        //定义大小 
        f.setBounds(300, 200, 500, 400);
        //添加背景颜色
        f.setBackground(Color.getHSBColor(112, 223,227));       
        //显示
        f.setVisible(true);
        //取消区域
        f.setLayout(null);          
        //窗口监听
        f.addWindowListener(new WindowAdapter() {
            //重写方法 关闭事件
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        }); 
        setMenu(f);
        txt(f);
    }
    public static void setMenu(Frame f ){
        MenuBar mb = new MenuBar();//创建菜单栏
        f.setMenuBar(mb);//窗口方法添加menubar
        //创建菜单对象
        Menu m = new Menu("喜欢的");
        Menu n = new Menu("不喜欢的");
        mb.add(m);//菜单栏的方法add添加菜单
        mb.add(n);
        //创建菜单项
        Menu mi = new Menu("柯南");
        MenuItem m2 = new MenuItem("大柯南");
        Menu mi1 = new Menu("新一");
        MenuItem m1 = new MenuItem("小新一");
        MenuItem mi2 = new MenuItem("小兰");
        MenuItem ni = new MenuItem("内向的");
        MenuItem ni1 = new MenuItem("不自信的");
        MenuItem ni2 = new MenuItem("躺着也中枪了~");
        //菜单添加菜单
        m.add(mi);
        m.add(mi1);
        //菜单项添加到菜单  菜单的方法add()
        mi.add(m1);
        mi1.add(m2);
        m.add(mi2);
        n.add(ni);
        n.add(ni1);
        n.add(ni2); 
        //菜单有监视机制吗?
        mi.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent e) {
                Frame f =new Frame("柯南");
                //定义大小 
                f.setBounds(300, 200, 500, 400);
                //添加背景颜色
                f.setBackground(Color.getHSBColor(112, 223,227));       
                //显示
                f.setVisible(true);
                //取消区域
                f.setLayout(null);      
                //创建文本区域
                TextArea ar = new TextArea("吃了药丸变小的工藤新一~~!");
                ar.setBounds(45, 105, 380, 280);
                f.add(ar);  
                ar.setFont(new Font("宋体",Font.BOLD,25));
                //窗口监听
                f.addWindowListener(new WindowAdapter() {
                    //重写方法 关闭事件
                    public void windowClosing(WindowEvent e){
                        System.exit(0);//崩溃 返回不了上一级了 用多线程?
                    }
                }); 

            }
        });
    }
    //创建文本框     以及按钮
    public static void txt(Frame f ){
        //创建文本框
        final TextField t = new TextField();
        t.setBounds(45, 70, 280, 25);
        f.add(t);
        //按钮
        Button but = new Button("自信");
        Button but1 = new Button("不自信");
        but.setBounds(360, 70, 55, 25);
        but1.setBounds(420, 70, 55, 25);
        f.add(but);
        f.add(but1);
        //创建文本区域
         final TextArea ar = new TextArea("看到了千万别生气哦~~!");
        ar.setBounds(45, 105, 380, 280);
        f.add(ar);  
        ar.setFont(new Font("宋体",Font.BOLD,25));
            //按钮监听机制
        but.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e ){
                //判断文本框里面是否为空
                if ("".equals(t.getText())) {
                    return;
                }
                ar.append(t.getText()+"\r\n");//\r\n可以用System方法获取
                t.setText("");
            }
        });
        but1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e ){            
                ar.setText("qixin  你真的很自信哦~!~");
            }
        });
    }
}

//如果在菜单项这个事件源上加上 监视机制该怎么写那?
//应该把相同的直接提取出来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值