java中的AWT编程

AWT编程

AWT简介

AWT定义

AWT:一个GUI类库,抽象窗口工具集(CAbstract Window Toolkit)
使用AWT创建的图形界面应用和所在的运行平台有相同的界面风格

AWT的继承体系

Object Component MenuComponent Choice TextConponent CheckBox Lable list Container Cavas ScrollBar Button TextArea TextField Panel Window ScrollPanel MenuItem MenuBar Menu

Componet:

代表一个能以图片化形式显示出来,并可与用户交互的对象,例如Button代表一个按钮,TextField代表一个文本框等;

MenuComponent:

代表图形界面的菜单组件,包括MenuBar(菜单条)、MenuItem(菜单项)等子类

Container:

是一种特殊的Componet,它代表一种容器,可以盛装普通的Component

Container的继承体系

Container Window:窗口容器 Panel:内嵌容器 ScrollPane:含有滚动条的容器 Frame:创建窗口 Dialog:创建对话框 Applet

AWT使用

Window,Panel,ScrollPane的使用

  • Window是可以独立存在的*窗口,默认使用BorderLayout管理其内部组件布局
  • Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使用FlowLayout管理其内部组件布局
  • ScrollPane是一个带滚动条的容器,它也不能独立存在,默认使用BorderLayout管理其内部组件布局

可能出现的中文编码问题解决办法:

  • -Dfile.encoding=GBK
    java中的AWT编程

Window:

public class WindowDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("window");

        frame.setLocation(100, 100); //设置位置
        frame.setSize(500, 300); //设置窗口大小
        frame.setVisible(true); // 设置可见
    }
}

java中的AWT编程

Panel:

public class PanelDemo {
    public static void main(String[] args) {
        //Panel对象必须依附于Window
        
        //创建window对象
        Frame frame = new Frame("panel");

        //创建Panel对象
        Panel panel = new Panel();
        panel.add(new TextField("textField"));  // 添加文本框
        panel.add(new Button("button"));  // 添加按钮

        //panel添加到window中
        frame.add(panel);

        //设置window位置和大小
        frame.setBounds(100, 100, 500, 300);

        //设置window可见
        frame.setVisible(true);
    }
}

java中的AWT编程
ScrollPane:

public class ScrollPanelDemo {
    public static void main(String[] args) {
        //创建window对象
        Frame frame = new Frame("ScrollPane");

        //创建Panel对象
        ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);  //设置滚动条总是显示
        scrollPane.add(new TextField("textField"));
        scrollPane.add(new Button("button"));

        //panel添加到window中
        frame.add(scrollPane);

        //设置window位置和大小
        frame.setBounds(100, 100, 500, 300);

        //设置window可见
        frame.setVisible(true);
    }
}

java中的AWT编程

布局管理器

  • LayoutMananger布局管理器可以根据运行平台来自动调整组件大小
LayeroutManager GridLayout FlowLayout LayoutManager2 CardLayout GridBagLayout BorderLayout

FlowLayout

  • 从左向右排列所有组件,遇到边界就会折回下一行重新开始
public class FlowLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("FlowLayout");

        // 设置布局管理器并且左对齐,水平和垂直间距都是20
        frame.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));

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

        //设置最佳大小
        frame.pack();
        frame.setVisible(true);
    }
}

java中的AWT编程

BorderLayout

  • 将容器分为EAST,SOUTH,WEST,NORTH,CENTER五个区域,普通组件可以被放置在这五个区域中的任意一个
  • 当改变使用BorderLayout的容器大小时,NORTH,SOUTH和CENTER区域水平调整,而EAST,WEST和CENTER区域垂直调整
  • 添加组件时,需要指定添加到哪个区域中,如果没有指定添加到哪个区域中,则默认添加到中间区域中
  • 如果向同一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件
public class BorderLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("BorderLayout");

        // 水平间距30, 垂直间距10
        frame.setLayout(new BorderLayout(30, 10));

        frame.add(new Button("North"), BorderLayout.NORTH);
        frame.add(new Button("South"), BorderLayout.SOUTH);
        frame.add(new Button("East"), BorderLayout.EAST);
        frame.add(new Button("West"), BorderLayout.WEST);
        frame.add(new Button("Center"), BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
    }
}

java中的AWT编程

GridLayout

  • 将容器分割成纵横线分割的网格,每个网格所占的区域大小相同
  • 添加组件时,默认从左向右,从上向下依次添加到每个网格中
public class GridLayoutDemo {

    public static void main(String[] args) {
        Frame frame = new Frame("GridLayout");

        // 添加输入文本框
        Panel p_text = new Panel();
        p_text.add(new TextField(30));
        frame.add(p_text, BorderLayout.NORTH);

        //添加数组
        Panel p_num = new Panel();
        // 3行5列
        p_num.setLayout(new GridLayout(3, 5, 4, 4));
        for (int i = 0; i < 10; i++) {
            p_num.add(new Button(String.valueOf(i)));
        }
        p_num.add(new Button("+"));
        p_num.add(new Button("-"));
        p_num.add(new Button("*"));
        p_num.add(new Button("/"));
        p_num.add(new Button("."));
        frame.add(p_num);

        frame.pack();
        frame.setVisible(true);
    }
}

java中的AWT编程

GridBagLayout

  • 与GridLayout形似,但该布局可以占据多个网格

CardLayout

  • 将加入容器的所有组件看成一叠卡片,每次只有最上面的组件可见。
public class CardLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("CardLayout");

        CardLayout cardLayout = new CardLayout();

        //中间区域panel
        Panel p1 = new Panel();
        p1.setLayout(cardLayout);
        String[] names = {"第一张","第二张","第三张","第四张","第五张"};
        for (int i = 0; i < names.length; i++) {
            p1.add(names[i], new Button(names[i]));
        }
        frame.add(p1);

        //五个按钮区域
        Panel p2 = new Panel();
        Button b1 = new Button("上一张");
        Button b2 = new Button("下一张");
        Button b3 = new Button("第一张");
        Button b4 = new Button("最后一张");
        Button b5 = new Button("第三张");

        //创建事件监听器,监听按钮的点击动作
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                // 获取到按钮上的文字
                String actionCommend = actionEvent.getActionCommand();
                switch (actionCommend) {
                    case "上一张":
                        cardLayout.previous(p1);
                        break;
                    case "下一张":
                        cardLayout.next(p1);
                        break;
                    case "第一张":
                        cardLayout.first(p1);
                        break;
                    case "最后一张":
                        cardLayout.last(p1);
                        break;
                    case "第三张":
                        cardLayout.show(p1, "第三张");
                        break;
                }
            }
        };

        //把事件监听器和按钮绑定到一起
        b1.addActionListener(listener);
        b2.addActionListener(listener);
        b3.addActionListener(listener);
        b4.addActionListener(listener);
        b5.addActionListener(listener);

        p2.add(b1);
        p2.add(b2);
        p2.add(b3);
        p2.add(b4);
        p2.add(b5);
        frame.add(p2, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }
}

java中的AWT编程

BoxLayout

  • 可以在垂直和水平两个方向上拜访GUI组件
public class BoxLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("BoxLayout");

        //创建BoxLayout对象,该对象存放的组件是垂直存放
        BoxLayout boxLayout = new BoxLayout(frame, BoxLayout.Y_AXIS);

        frame.setLayout(boxLayout);
        frame.add(new Button("button1"));
        frame.add(new Button("button2"));

        frame.pack();
        frame.setVisible(true);
    }
}

java中的AWT编程

Box容器

  • 该容器默认布局管理器是BoxLayout,大多数情况下,使用Box容器容纳多个GUI组件,然后再把Box容器作为一个组件,添加到其他的容器中,从而形成整体窗口布局。
public class BoxDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("Box");

        //创建水平排列组件的Box容器
        Box hBox = Box.createHorizontalBox();
        hBox.add(new Button("h_button1"));
        hBox.add(Box.createHorizontalGlue()); // 在两个方向上拉伸
        hBox.add(new Button("h_button2"));
        hBox.add(Box.createHorizontalStrut(30)); //固定分割长度
        hBox.add(new Button("h_button3"));

        //创建垂直排列组件的Box容器
        Box vBox = Box.createVerticalBox();
        vBox.add(new Button("v_button1"));
        vBox.add(Box.createVerticalGlue());
        vBox.add(new Button("v_button2"));
        vBox.add(Box.createVerticalStrut(30));
        vBox.add(new Button("v_button3"));

        //添加到frame中
        frame.add(hBox, BorderLayout.NORTH);
        frame.add(vBox);

        frame.pack();
        frame.setVisible(true);
    }
}

java中的AWT编程

AWT中的基本组件

组件名 功能
Button 按钮
Canvas 用于绘图的画布
Checkbox 复选框组件(也可当单元框组件使用)
CheckboxGroup 用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个被选中,即全部变成单选框组件
Choice 下拉选择框
Frame 窗口,在GUI程序里通过该类创建窗口
Label 标签类,用于放置提示性文本
List 列表框组件,可以添加多项条目
Panel 不能单独存在基本容器类,必须放在其他容器中
Scrollbar 滑动条组件。如果需要用户输入位于某个范围的值,就可以使用滑动条组件,比如调色板中设置RGB的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、滑块的大小、最小值和最大值。
ScrollPane 带水平及垂直滑动条的容器组件
TextArea 多行文本域
TextField 单行文本域
public class BasicComponentDemo {
    Frame frame = new Frame("基本组件");

    //多行文本区域
    TextArea ta = new TextArea(5, 20);

    //下拉选择框
    Choice colorChooser = new Choice();

    //选择框
    CheckboxGroup cbg = new CheckboxGroup();
    Checkbox male = new Checkbox("男", cbg, true);
    Checkbox female = new Checkbox("女", cbg, false);

    //选择框
    Checkbox isMarried = new Checkbox("是否已婚?");

    //单行文本区域
    TextField tf = new TextField(50);
    Button ok = new Button("确认");

    //列表框
    List colorList = new List(6, true);

    public void init(){
        //组装底部
        Box bBox = Box.createHorizontalBox();
        bBox.add(tf);
        bBox.add(ok);
        frame.add(bBox, BorderLayout.SOUTH);

        //组装选择部分
        colorChooser.add("红色");
        colorChooser.add("蓝色");
        colorChooser.add("绿色");
        Box cBox = Box.createHorizontalBox();
        cBox.add(colorChooser);
        cBox.add(male);
        cBox.add(female);
        cBox.add(isMarried);
        frame.add(cBox);

        //组装文本域和选择部分
        Box topLeft = Box.createVerticalBox();
        topLeft.add(ta);
        topLeft.add(cBox);
        frame.add(topLeft);

        //组装顶部左边和列表框
        Box top = Box.createHorizontalBox();
        colorList.add("红色");
        colorList.add("绿色");
        colorList.add("蓝色");
        top.add(topLeft);
        top.add(colorList);
        frame.add(top);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        BasicComponentDemo bc = new BasicComponentDemo();
        bc.init();
    }
}

java中的AWT编程

上一篇:问题归纳


下一篇:Android UI控件详解-Button(按钮)点击事件的5种写法