Java学习-Day22(GUI(2))

动作事件
动作事件与前面三种事件有所不同,它不代表某个具体的动作,只是表示一个动作发生了。例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭,但是我们不需要关心使用哪种方式对文件进行关闭,只要是对关闭按钮进行操作,即出发了动作事件。
在Java中动作事件用ActionEvent类表示,处理ActionEvent 事件的监听器对象需要实现ActionListener接口,但监听器对象在监听动作时,不会像鼠标事件一样处理鼠标个别的移动和单机的细节,而是去处理“按钮按下”这样有意义的事件。

布局管理器
在java.awt包中提供了五种布局管理器,分别是FlowLayout(流式布局管理器)、BorderLayout(边界布局管理器)、GridLayout(网格布局管理器)、GridBagLayout(网格包布局管理器)和CardLayout(卡片布局管理器)。
每个容器在创建时都会使用一种默认的布局管理器,在程序中可以通过调用容器对象的setLayout()方法设置布局管理器,通过布局管理器来自动进行组件的布局管理。

1、FlowLayout
流式布局管理器是最简单的布局管理器,在这种布局下,容器会将组件按照添加顺序从左往右放置。当到达容器的边界时,会自动将组件放到下一行的开始位置。
FlowLayout的构造方法:
在这里插入图片描述
其中,参数align决定组件在每行中相对于容器边界的对齐方式,可以使用该类中提供的常量作为参数传递给构造方法,FlowLayout.LEFT用于表示左对齐,FlowLayout.RIGHT用于表示右对齐,FlowLayout.CENTER用于表示居中对齐,参数hgap和参数vgap分别设定组件之间的水平和垂直间距。

public class Demo01_FlowLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("我的窗口");
        frame.setSize(500,300);
        frame.setLocation(500,500);
        frame.setVisible(true);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT,30,20));
        Button b1 = new Button("button1");
        frame.add(b1);
        b1.addActionListener(new ActionListener() {
            int num = 2;
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.add(new Button("button" + num++));
                frame.setVisible(true);
            }
        });
    }
}

在这里插入图片描述
FlowLayout布局管理器的特点就是可以将所有组件想流水一样一次进行排列,不需要用户明确设定,但是在灵活性上相对差了点。

BorderLayout
BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器分为五个区域,分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。
当向BorderLayout布局管理器的容器中添加组件时,需要使用add(Component comp,Object constraints)方法,其中参数contraints是Object类型,在传参时可以使用BorderLayout类提供的5个常量,分别是EAST、SOUTH、WEST、NORTH、CENTER。

public class Demo02_BorderLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("我的窗口");
        frame.setVisible(true);
        frame.setSize(400,300);
        frame.setLocation(500,500);

        frame.setLayout(new BorderLayout());

        Button b1 = new Button("EAST");
        Button b2 = new Button("WEST");
        Button b3 = new Button("SOUTH");
        Button b4 = new Button("NORTH");
        Button b5 = new Button("CENTER");

        frame.add(b1,BorderLayout.EAST);
        frame.add(b2,BorderLayout.WEST);
        frame.add(b3,BorderLayout.SOUTH);
        frame.add(b4,BorderLayout.NORTH);
        frame.add(b5,BorderLayout.CENTER);
    }
}

在这里插入图片描述
BorderLayout的好处就是可以限定各区域的边界,当用户改变容器大小时,各个组件的相对位置不变。但需要注意的是,向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域,并且每个区域只能放置一个组件,如果想一个区域中添加多个组件,则后放入的组件会覆盖先放入的组件。

3、GridLayout
GridLayout(网格布局管理器)使用纵横线将容器分为n行n列大小相等的网格,每个网格中放置一个组件。添加到容器中的组件首先放置在第1行第1列的网格中,然后在第1行的网格中从左到右依次放置其他组件,行满后,继续在下一行中从左往右放置组件。与FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域。
GridLayout的构造方法:
在这里插入图片描述
其中,参数rows代表行数,参数cols代表列数,hgap和vgap规定水平和垂直方向的间距。

public class Demo03_GridLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("我的窗口");
        frame.setVisible(true);
        frame.setSize(400,300);
        frame.setLocation(500,500);

        frame.setLayout(new GridLayout(3,3));

        for(int i = 1; i <= 9; i ++){
            Button button = new Button("button" + i);
            frame.add(button);
        }
    }
}

在这里插入图片描述
GridLayout布局管理器的特点就是组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。缺点是总是忽略组件的最佳大小,所有组件的宽高相同。

public class Demo {
    public static void main(String[] args) {
        Frame f = new Frame("布局");
        f.setVisible(true);
        f.setSize(300,300);
        Button b1 = new Button("East");
        Button b2 = new Button("West");
        Button b3 = new Button("South");
        Button b4 = new Button("North");

        Panel panel = new Panel();
        panel.setLayout(new GridLayout(3,3));
        for (int i = 1; i <= 9; i++) {
            Button b = new Button(String.valueOf(i));
            panel.add(b);
        }

        f.add(b1,BorderLayout.EAST);
        f.add(b2,BorderLayout.WEST);
        f.add(b3,BorderLayout.SOUTH);
        f.add(b4,BorderLayout.NORTH);
        f.add(panel,BorderLayout.CENTER);
    }
}

在这里插入图片描述
Panel无法单独显示,必须添加到某个容器中。
当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。

AWT绘图
很多GUI程序都需要在组件上绘制图形,比如实现一个五子棋的小游戏,就需要在组件上绘制棋盘和棋子。在java.awt包中专门提供了一个Grapfics类,它相当于一个抽象的画笔,其中提供了各种绘制图形的方法,使用Graphics类的方法就可以完成在组件上绘制图形。
Graphics类常用方法:
方法声明 ——功能描述
void setColor(Color c) ——将此图形上下文的当前颜色设置为指定颜色
void setFont(Font f) ——将此图形上下文的字体设置为指定字体
void drawline(int x1,int y1,int x2,int y2) —— 以(x1,y1)和(x2,y2)为端点绘制一条线段
void drawRect(int x,int y,int width,int height) ——绘制指定矩形的边框,矩形的左边缘和右边缘分别位于x和x+width,上边缘和下边缘分别位于y和y+height
void drawOval(int x,int y,int width,int height) ——绘制椭圆的边框,得到一个圆或椭圆,它刚好能放入由x、y、width和height参数指定的矩形中,椭圆覆盖区域的宽度为width+1像素,高度为height+1 像素
void fillRect(int x,int y,int width,int height) ——用当前颜色填充指定的矩形,该矩形左边管和在右边缘分别位于x和x+width-1,上边缘和下边缘分别委员y和y+height-1
void fillOval(int x,int y,int width,int height) ——用当前颜色填充外接指定矩形框的椭圆
void drawString(String str,int x,int y) ——使用当前上下文的当前字体和颜色绘制指定的文本str,最左侧字符左下角位于(x,y)坐标

setColor():用于指定上下文颜色,方法中接收一个Color类型的参数,Color类嗲表颜色,其中定义了许多代表个中颜色的常量,比如Color.RED、Color.BLUE等都是Color类型。
setFont():用于指定上下文字体,方法中接收一个Font类型的参数,Font类型嗲表字体,可以使用new关键字创建Font对象。Font的构造方法中接收三个参数,第一个是String类型,表示字体名称,例如宋体、微软雅黑等;第二个参数是int类型,表示字体的样式,接收Font类的三个常量Font.PLAINT、Font.ITALIC和 Font.BOLD;第三个参数为int类型,表示字体大小。
drawRect()和drawOval():用于绘制矩形和椭圆形的边框,fillRect()和fillOval()用于使用当前的颜色填充绘制的矩形和椭圆形。
drawString():用于绘制一段文本,第一个参数str表示绘制的文本内容,第二个和第三个参数x、y为绘制文本的左下角坐标。

public class Test {
    public static void main(String[] args) {

        Frame f = new Frame("绘画");
        f.setVisible(true);
        f.setLocation(500,500);
        f.setSize(400,400);
        MyPanel2 panel = new MyPanel2();
        f.add(panel);
    }
}

class MyPanel2 extends Panel {

    @Override
    public void paint(Graphics g) {

        g.setColor(Color.red);
        g.drawLine(100,100,200,200);

        g.setColor(Color.blue);
        g.drawRect(100,100,200,200);

        g.setColor(Color.black);
        g.drawOval(100,100,200,200);
        //g.fillOval(100,100,200,200);

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值