javaGUI知识(一)

一、AWT编程
1. 图形用户界面(Graphics User Interface, GUI) 是用户与程序交互的窗口,它比基于命令行的界面更直观并且更友好。
        GUI的基本类库位于java.awt包中,Sun最早提供的GUI库,这个包也被称为抽象窗口工具箱(Abstract Window Toolkit, AWT)。 提供一些基本组件和功能,AWT按照面向对象的思想来创建GUI,它提供了容器类、众多的组件类和布局管理器类。通过AWT(或者Swing)提供的图形界面组件库,程序只要一次创建所需的图形组件,并以合适的方式将这些组件组织在一起,以一种“搭积木”的方式,就可以开发出实际可用的图形用户界面。但是这样的图形用户界面还不能与用户交互,为了实现图形界面与用户交互操作,还应为程序提供事件处理,事件处理负责让程序可以响应用户动作。

注:使用AWT创建的图形界面应用和所在的运行平台有相同的界面风格,AWT在程序运行时,将组件(按钮,文本框等)的创建和动作委托给所在的运行平台,jvm使用调用操作系统本地的图形界面来创建和平台一直的对等体。
          
 AWT构建图形用户界面的机制包括:
            . 提供了一些容器组件(如Frame和Panel), 用来容纳其他的组件(如按钮Button、复选框Checkbox和文本框TextField)。
            . 用布局管理器来管理组件在容器上的布局;
            . 利用监听器来响应各种事件,实现用户与程序的交互。一个组件如果注册了某种事件的监听器,由这个组件触发的
              特定事件就会被监听器接收和响应;

      2.awt包中图形界面元素基类:
component(能以图形化方式显示的界面元素,按钮,文本框)
提供如以下方法:setLocation,setSize,setBounds,setVisible

2.1
component的子类有各种图形化组件,如按钮,文本框等,也有一个子类,代表可以盛装  其他组件的“容器。
1)
Container:component的子类,代表容器,本身也是一个组件。
有以下方法:add,getComponent,getComponentCount,getComponents。
Container中主要有如下两种容器类型:
2.2.1 Window:可容纳其他组件,可独立存在的“顶级”窗口,有子类:Frame
Frame:常见的窗口,特点:
1.有标题,允许通过拖拉来改变窗口的位置、大小
2.初始化时为不可见,需要用过setVisible(true)使其显示出来
3.默认采用BorderLayout作为布局管理器
4.不能被添加到其他容器中。

2.2.2 Panel:可容纳其他组件,但是不能独立存在,必须被添加到其他容器中,如Panel,window,frame。panel外在表现为一个矩形区域,该区域内可盛装其他组件,panel容器存在的意义在于为其他组件提供空间,panel容器具有以下几个特点:
1.可作为容器来盛装其他组件,为放置其他组件(按钮,框)提供空间
2.不能独立存在,必须放置到其他容器中。
3.默认使用FlowLayout作为其布局管理器。
2)其他组件:component的子类。
Buttom:按钮
label:放一段提示性文本
textFiled:单行文本框
textArea:多行文本框
checkbox:复选框组件
checkGroup:将复选框变为单选框
choice:下拉框
list:列表框






      二. 创建GUI 步骤一:选择一个容器


            java.awt包中提供了一个抽象类Component,它是所有除了菜单类组件之外的AWT组件的父类。Container类表示容器,继承了Component类。容器用来存放别的组件, 有两种类型的容器:Window和Panel。


            1. Window和它的子类Frame
 
               Window是不依赖于其他容器而独立存在的容器。Window的子类Frame是我们最常用的一种容器。
               Frame有一个构造方法——Frame(String title),通过它可以创建一个以参数为标题的Frame对象。Frame的add()方法
               向容器中加入其他组件。当Frame被创建后,它是不可见的,必须通过以下步骤使Frame成为可见的。


               1) setSize(int width, int height)显示设置Frame的大小,或者调用pack()方法自动确定Frame的大小。pack()方法会确保Frame容器中的组件都会有与布局相适应的合理大小。
               2) setVisible(true)方法使Frame成为可见的。


 
import java.awt.*;
public class SimpleFrame {
public static void main(String[] args) {
Frame frame = new Frame("hello");
frame.setSize(200, 200);
frame.setLocation(100, 100);
//frame.setBounds(200, 200, 100, 100);
f.setVisible(true);
}
}
    
            2.  Panel


                Panel不能单独存在,只能存在于其他容器中(Window或其子类)中,一个Panel对象代表了一个长方形的区域,在这区域中可以容纳其他的组件。
                可以通过Panel类的默认构造方法来创建一个Panel对象,然后通过Panel的add()方法向Panel中添加组件。如果要使Panel成为可见的,必须通过Frame或Window的add()方法把Panel添加到Frame或Window中。


import java.awt.*;
public class SimplePanel {
public static void main(String[] args) {
Frame frame = new Frame("测试窗口--Panel");
//创建不可独立存在的容器Panel
Panel panel = new Panel();
//创建一个单行文本输出框
TextField tf = new TextField(20);
//创建一个按钮
Button bn = new Button("确定");
//把文本框、按钮添加到Panel
panel.add(tf);
panel.add(bn);
//把panel添加到frame
frame.add(panel);
frame.setBounds(300, 300, 300, 200);
//设置窗体可见
frame.setVisible(true);
}
}
3.其他容器比如:ScrollPane,是一个带滚动条的容器,也不能独立存在。
//创建顶级可显示窗口frame
Frame frame = new Frame("测试窗口--Panel");
//创建不可独立存在的容器ScrollPane,可以根据参数不同设置滚动条
ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
//创建一个单行文本输出框
TextField tf = new TextField(20);
//创建一个按钮
Button bn = new Button("确定");
//把文本框、按钮添加到Panel
sp.add(tf);
sp.add(bn);
//把panel添加到frame
frame.add(sp);
frame.setBounds(300, 300, 300, 200);
//设置窗体可见
frame.setVisible(true);

观察以上可知,我们在ScrollPane容器中添加了两个组件,却只显示出来一个,是因为ScrollPane默认采用了BorderLayout的布局,BorderLayout导致了该容器只显示出来一个组件。
                
                  
        三. 创建GUI 步骤二:布局管理器
为了让组件的大小位置和平台无关,具有良好的平台无关性,我们使用布局管理器来管理容器中组件的位置大小,而不是直接设置。
组件在容器中的位置和尺寸是由布局管理器来决定的。所有的容器都会引用一个布局管理器实例,通过它来自动进行组件的布局管理。


            1. 默认布局管理器


               当一个容器被创建后,它们有相应的默认布局管理器。Window、Frame、ScrollPane的默认布局管理器是BorderLayout, Panel的默认布局管理器是FlowLayout。可以通过setLayout()方法来重新设置容器的布局管理器。例:


               Frame f = new Frame("hello");
               f.setLayout(new FlowLayout());


            2. 取消布局管理器(绝对定位)


               如果不希望通过布局管理器来管理布局,可以调用容器的setLayout(null)方法,这样布局管理器就被取消了。


               接下来必须调用容器中每个组件的setLocation(), setSize()或setBounds()方法,为这些组件在容器中一一定位。


               和布局管理器管理方式不同的是,这种手工布局将导致图形界面的布局不再和平台无关的。相反,图形界面的布局将依赖
               于操作系统环境。


import java.awt.*;
public class ManualLayout {
public static void main(String[] args) {
Frame f = new Frame("hello");
f.setLayout(null);    //取消布局管理器
f.setSize(300,100);                 //宽300, 高100
Button b = new Button("press me");
b.setSize(100,30);                  //宽100, 高30
b.setLocation(40,60);               //x坐标40, y坐标60
f.add(b);
f.setVisible(true);
}
}              


            3. 布局管理器种类


               常用的四种管理器
               
               a. FlowLayout流式布局管理器;
               b. BorderLayout边界布局管理器;
               c. GridLayout网格布局管理器;
               d. CardLayout卡片布局管理器;
  
        四. 创建GUI 步骤三:在容器中加入组件


        五. 创建GUI 步骤四:创建事件处理器


        六. FlowLayout流式布局管理器


            最简单的布局管理器,按照组件的添加次序将它们从左到右地放置在容器中。当到达容器边界时,组件将放置在下一行中。
            FlowLayout允许以左对齐、居中对齐(默认方式)或右对齐的方式排列组件。特性:


            . 不限制它所管理的组件的大小, 而是允许它们有自己的最佳大小。
            . 当容器被缩放时,组件的位置可能会变化,但组件的大小不改变。


            FlowLayout的构造方法如下:


            . FlowLayout();
            . FlowLayout(int align);
            . FlowLayout(int align, int hgap, int vgap) 
             
            参数align用来决定组件在每行中相对于容器的边界的对齐方式,可选值有:
         
            FlowLayout.LEFT(左对齐)
            FlowLayout.RIGHT(右对齐)
            FlowLayout.CENTER(居中对齐)


            参数hgap和参数vgap分别设定组件之间的水平和垂直间隙。


Frame frame = new Frame("FlowLayout");
FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER,5,5);
frame.setLayout(flowLayout);
//创建按钮
for(int i=1;i<=10;i++){
Button bn = new Button("button"+i);
bn.setSize(50, 20);
frame.add(bn);
}



        七. BorderLayout边界布局管理器
            
            将容器分为五个区域:东、南、西、北和中。


            特征:


            . 东西区域的组件保持最佳宽度,高度被垂直拉伸至和所有区域一样高;
              南北区域的组件保持最佳高度,宽度被水平拉伸至和所在区域一样宽;
              位于中区域的组件的宽度和高度都被拉伸至和所在区域一样大小。
            . 垂直拉伸,东、西和中区域也拉伸;
              水平拉伸,南、北和中区域也拉伸;
            . 中区域没有组件,也会分配空间显示容器的背景颜色;
              其它区域没有组件,不会分配空间;
            . 容器被缩放,组件所在的相对位置不变化,但组件大小改变;
            . 某个区域添加的组件不止一个,则只有最后添加的一个是可见的;


            构造方法:
       
            . BorderLayout();
            . BorderLayout(int hgap, int vgap);
            参数hgap和参数vgap分别设定组件之间的水平和垂直间隙;


            对于采用BorderLayout的容器,当它用add()方法添加一个组件时,可以同时为组件指定在容器中的区域。


            void add(Component comp, Object constraints) 


            这里的constraints是String类型,可选值为BorderLayout提供的五个常量:


            . BorderLayout.NORTH: 北区域,值为"North";
            . BorderLayout.SOUTH: 南区域,值为"South";
            . BorderLayout.EAST: 东区域,值为"East";
            . BorderLayout.WEST: 西区域,值为"West";
            . BorderLayout.CENTER: 中区域,值为"Center";


            Frame的默认布局管理器就是BorderLayout。以下代码把Button放在Frame的北区域。


            Frame f = new Frame("Test");
            f.add(new Button("b1",BorderLayout.NORTH));
            //或者:f.add(new Button("b1","North"));


            如果不指定add()方法的constraints参数,在默认情况下把组件放在中区域。以下代码向Frame的中区域加入两个Button,
            但只有最后加入的Button是可见的。


            Frame f = new Frame("Test");
            f.add(new Button("b1"));
            f.add(new Button("b2"));
            f.setSize(100,100);
            f.setVisible(true);


          


        八. GridLayout网格布局管理器


            GridLayout将容器分割成许多行和列,组件被填充到每个网格中。添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其他组件,直至占满该行的所有网络,接着继续在下一行中从左到右放置组件。特性如下:


            . 组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变。组件始终占据网格的整个区域。
            . GridLayout总是忽略组件的最佳大小,所有组件的宽度相同,高度也相同。
            . 将组件用add()方法添加到容器中的先后顺序决定它们占据哪个网络。GridLayout从左到右、从上到下将组件填充到容器
              的网格中。


            GridLayout的构造方法如下:


            . GridLayout()
            . GridLayout(int rows, int cols)
            . GridLayout(int rows, int cols, int hgap, int vgap)


            参数rows代表行数,参数cols代表列数。参数hgap和vgap规定水平(网络之间的水平距离)和垂直方向(网格之间的垂直距离)
            的间隙。

Frame frame = new Frame("GridLayout");
frame.setLayout(new BorderLayout());
frame.add(new TextField(30), BorderLayout.NORTH);
String[] btnNames = {"1","2","3","4","5","6","7","8","9","0","+","-","*","/","="};
Panel panel = new Panel();
panel.setLayout(new GridLayout(3, 5));
for(int i=0;i<btnNames.length;i++){
Button bn = new Button(btnNames[i]);
panel.add(bn);
}
frame.add(panel);
frame.pack();
frame.setVisible(true);

            


        九. CardLayout卡片布局管理器


            将界面看做一系列的卡片,在任何时侯只有其中一张卡片是可见的,这张卡片占据容器的整个区域。CardLayout的构造方法:


            . CardLayout()
            . CardLayout(int hgap, int vgap)


            参数hgap表示卡片和容器的左右边界之间的间隙,参数vgap表示卡片和容器的上下边界的间隙。


            对于采用CardLayout的容器,当用add()方法添加一个组件时,需要同时为组件指定所在的卡片的名字。


            void add(Component comp, Object constraints)


            以上constraints参数是一个字符串,表示卡片的名字。在默认情况下,容器显示第一个用add()方法加入到容器中的组件,


            也可以通过CardLayout的show(Container parent, String name)方法指定显示哪张卡片,参数parent指定容器,参数name指定卡片的名字。

Frame frame = new Frame("CardLayout");
CardLayout c = new CardLayout();
frame.setLayout(c);
for(int i=1;i<5;i++){
Label lb = new Label("number"+i);
frame.add(i+"",lb);
}
c.next(frame);
c.show(frame, "4");
c.previous(frame);
c.first(frame);
c.last(frame);
frame.setBounds(200, 200, 300, 300);
frame.setVisible(true);

     十、事件处理:根据放置各种组件,我们可以创建出不同的图形化界面,但是这些界面还不能响应用户的任何操作,比如窗体上的×,按钮的点击等。也就是说不能与用户交互,awt中与用户交互需要用到事件机制。


java事件模型:
为了使图形界面能够接收到用户的操作,我们需要给各个组件添加上事件处理。(事件监听器)
在事件处理过程中,主要涉及三类对象:
event source(事件源):事件发生的场所,源头,通常指各种组件
event(事件):事件封装了GUI组件上发生的特定事情
event Listeren(事件监听器):负责监听事件源发生的事件,并对不同事件做出响应处理。
时间监听器中有很多方法(事件处理器)负责处理不同事件,做出响应处理,当事件源上事件发生的时候,事件对象会作为参数传递给事件处理器。


1.创建事件监听器类(实现XxxListener接口),完成事件处理器
2.创建事件源对象,即普通组件
3.把事件监听器绑定到事件源对象上,调用事件源对象的addXxxListener方法
4.当事件源上发生指定事件,AWT会触发事件监听器,调用对应的方法(事件处理器)来处理事件,事件源上发生的事件会作为参数传到事件处理器上。


常用事件:
ComponentEvent:组件事件,组件尺寸、位置、显示/隐藏状态改变时
ContainerEvent:容器时间,向容器中添加组件、删除组件时
WindowEvent:窗口事件,当窗口状态发生改变(打开关闭,最大化最小化)时触发
FocusEvent:焦点时间,当组件得到焦点或失去焦点时触发
keyEvent:键盘事件,当案件被按下、松开、单击时触发
MouseEvent:鼠标事件,当进行单击、按下、松开、移动鼠标等动作时
ActionEvent:动作事件,当按钮、下拉框等组件被单击,TextField中按Enter时
ItemEvent:选项事件,当用户选中某项,或取消选中某项时触发
TextEvent:文本事件,当文本框、文本域里的文本发生改变时触发该事件


监听器的写法:外部类,内部类,类本身,匿名内部类
一个组件可以被多个监听器监听,一个监听器可以监听多个组件。
       



































  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您编写一个简单的计算器,实现加减乘除四则运算的功能。以下是代码实现: ```java import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JTextField; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Calculator extends JFrame { private JPanel contentPane; private JTextField textField; double firstnum, secondnum, result; String operations, answer; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Calculator frame = new Calculator(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public Calculator() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 332, 416); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); textField = new JTextField(); textField.setBounds(10, 11, 296, 46); contentPane.add(textField); textField.setColumns(10); // Number buttons JButton btn1 = new JButton("1"); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn1.getText(); textField.setText(Enternumber); } }); btn1.setBounds(10, 77, 60, 50); contentPane.add(btn1); JButton btn2 = new JButton("2"); btn2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn2.getText(); textField.setText(Enternumber); } }); btn2.setBounds(80, 77, 60, 50); contentPane.add(btn2); JButton btn3 = new JButton("3"); btn3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn3.getText(); textField.setText(Enternumber); } }); btn3.setBounds(150, 77, 60, 50); contentPane.add(btn3); JButton btn4 = new JButton("4"); btn4.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn4.getText(); textField.setText(Enternumber); } }); btn4.setBounds(10, 138, 60, 50); contentPane.add(btn4); JButton btn5 = new JButton("5"); btn5.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn5.getText(); textField.setText(Enternumber); } }); btn5.setBounds(80, 138, 60, 50); contentPane.add(btn5); JButton btn6 = new JButton("6"); btn6.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn6.getText(); textField.setText(Enternumber); } }); btn6.setBounds(150, 138, 60, 50); contentPane.add(btn6); JButton btn7 = new JButton("7"); btn7.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn7.getText(); textField.setText(Enternumber); } }); btn7.setBounds(10, 199, 60, 50); contentPane.add(btn7); JButton btn8 = new JButton("8"); btn8.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn8.getText(); textField.setText(Enternumber); } }); btn8.setBounds(80, 199, 60, 50); contentPane.add(btn8); JButton btn9 = new JButton("9"); btn9.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn9.getText(); textField.setText(Enternumber); } }); btn9.setBounds(150, 199, 60, 50); contentPane.add(btn9); JButton btn0 = new JButton("0"); btn0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Enternumber = textField.getText() + btn0.getText(); textField.setText(Enternumber); } }); btn0.setBounds(80, 260, 60, 50); contentPane.add(btn0); // Operator buttons JButton btnPlus = new JButton("+"); btnPlus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { firstnum = Double.parseDouble(textField.getText()); textField.setText(""); operations = "+"; } }); btnPlus.setBounds(221, 77, 85, 50); contentPane.add(btnPlus); JButton btnMinus = new JButton("-"); btnMinus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { firstnum = Double.parseDouble(textField.getText()); textField.setText(""); operations = "-"; } }); btnMinus.setBounds(221, 138, 85, 50); contentPane.add(btnMinus); JButton btnMultiply = new JButton("*"); btnMultiply.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { firstnum = Double.parseDouble(textField.getText()); textField.setText(""); operations = "*"; } }); btnMultiply.setBounds(221, 199, 85, 50); contentPane.add(btnMultiply); JButton btnDivide = new JButton("/"); btnDivide.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { firstnum = Double.parseDouble(textField.getText()); textField.setText(""); operations = "/"; } }); btnDivide.setBounds(221, 260, 85, 50); contentPane.add(btnDivide); JButton btnClear = new JButton("C"); btnClear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { textField.setText(null); } }); btnClear.setBounds(150, 260, 60, 50); contentPane.add(btnClear); JButton btnEqual = new JButton("="); btnEqual.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String answer; secondnum = Double.parseDouble(textField.getText()); if (operations == "+") { result = firstnum + secondnum; answer = String.format("%.2f", result); textField.setText(answer); } else if (operations == "-") { result = firstnum - secondnum; answer = String.format("%.2f", result); textField.setText(answer); } else if (operations == "*") { result = firstnum * secondnum; answer = String.format("%.2f", result); textField.setText(answer); } else if (operations == "/") { result = firstnum / secondnum; answer = String.format("%.2f", result); textField.setText(answer); } } }); btnEqual.setBounds(10, 260, 60, 50); contentPane.add(btnEqual); } } ``` 运行后,您就可以使用这个计算器进行四则运算了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值