java基础(7)
1.GUI与CUI
GUI概述:全称为Graphical User Interface(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更方便更直观
CLI概述:Command line User Interface(命令行用户接口),就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观
2. awt和wing包
既然我们知道了GUI,而我们的java也提供了造图形界面的编程,而实现图形界面靠的是两个包,java.awt包和javax.swing包
java.awt:Abstract Window TooLKit(抽象窗口工具包),需要调用本地系统方法实现功能,属于重量级控件
javax.swing:在AWTd的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现,增强了移植性,属于轻量级控件
3.GUI继承体系图
4.如何造GUI窗体
概述:想要学习怎么造一个窗体,我们可以通过一个个案例来学习,因为造窗体需要学习的类很多,如一个按钮,一个文本框等,都是一个个的类,还有它们的方法,如果想全部学完,那需要花费很多的时间,所以我们通过案例来简单学习如何造GUI窗体
使用Frame类创建一个简单窗体
- public Frame():构造方法,带参构造则会创建一个带有Title的窗体
- setTitle:设置Title
- setSize:设置窗体大小
- setLocation:设置窗体位置
- setVisible:设置窗体可见
- setResizable(boolean b):设置窗体是否可调大小
- dispose:释放由此window及其子组件拥有的所有组件所使用的所有本机屏幕资源,继承自他父亲Window类
注意:这里建的是一个不可见的窗体,需要通过setVisible方法设置窗体可见,而且通过点击生成的窗体的“X”,是无法退出窗体的,那么怎么关闭窗体呢?我们通过事件监听机制关闭(后面会讲)
代码示例(创建一个窗体):
import java.awt.Frame;
public class FrameDemo {
public static void main(String[] args) {
//创建一个Frame对象
Frame f = new Frame();
//设置GUI界面标题
f.setTitle("javaGUI界面");
//设置大小
f.setSize(400, 300);
/*与上面设置大小代码等价
* Dimension d = new Dimension(400, 300);
* f.setSize(d);
*/
//设置位置
f.setLocation(400, 200);
/*
* 与上面设置位置大小代码等价
* Point p = new Point(400, 200);
f.setLocation(p);
*/
//设置位置和大小
//f.setBounds(400, 200, 400, 300);
//设置是否可见
f.setVisible(true);
}
}
事件监听机制
事件监听机制包括四个部分
- 事件源:事件发生的地方
- 事件:就是要发生的事情
- 事件处理:就是针对发生的事情做出的处理方案
- 事件监听:就是把事件源和事件关联起来
通过事件监听机制关闭窗体案例:
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class FrameDemo {
public static void main(String[] args) {
//创建一个Frame对象
Frame f = new Frame();
//设置GUI界面标题
f.setTitle("javaGUI界面");
//设置大小
f.setSize(400, 300);
//设置位置
f.setLocation(400, 200);
//设置窗体可见
f.setVisible(true);
f.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
//用户视图从窗口的系统菜单中关闭窗口时调用
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
});
}
}
思考:上面的案例中的WindowListener是一个接口,当我们实现这个接口的时候,就必须重写它的所有方法,但我们只使用了一个方法,其他方法显得很多余,那有什么方法可以只使用一个方法么?
答案是有的,我们通过适配器类来达到这样的效果,这个适配器类就是WindowAdapter
关闭窗口案例(适配器类实现):
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo2 {
public static void main(String[] args) {
//创建一个Frame对象
Frame f = new Frame();
//设置GUI界面标题
f.setTitle("javaGUI界面");
//设置大小
f.setSize(400, 300);
//设置位置
f.setLocation(400, 200);
//设置窗体可见
f.setVisible(true);
//添加监听机制
f.addWindowListener(new WindowAdapter() {
//适配器类实现
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
窗体添加按钮并对按钮设置事件案例
步骤:
- 创建窗体对象
- 创建按钮对象
- 把按钮添加到窗体
- 窗体显示
代码实现如下:
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo2 {
public static void main(String[] args) {
//创建一个Frame对象
Frame f = new Frame("有按钮的窗体");
f.setBounds(400, 200, 400, 300);
//设置窗体可见
f.setVisible(true);
/*设置窗体布局位流式布局,不设置的话默认是边界布局,
那么只有一个按钮的情况下就会占据整个窗体*/
f.setLayout(new FlowLayout());
//创建按钮对象
Button b = new Button("我是按钮");
b.setSize(200, 100);
//把按钮对象添加到窗体中
f.add(b);
//给窗体添加监听事件
f.addWindowListener(new WindowAdapter() {
//适配器类
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//给按钮添加监听事件
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("恭喜你,点了我");
}
});
}
}
知识点补充:常用的五个窗体布局(是实现了LayoutManager接口的不同具体类):
- 流式布局
- 边界布局
- 网格布局
- 网格包布局
- 卡片布局
把文本框的值转移到文本域案例
代码实现如下:
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo3 {
public static void main(String[] args) {
Frame f = new Frame("转移文本");
//设置为流式布局
f.setLayout(new FlowLayout());
f.setBounds(400, 200, 400, 300);
//创建组件
Button b = new Button("数据转移");
TextField tf = new TextField(20);
TextArea ta = new TextArea(10, 30);
//把组件添加到窗体里
f.add(tf);
f.add(b);
f.add(ta);
//给按钮添加监听事件
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取文本域数据
String tfStr = tf.getText().trim();
//设置文本域数据
//ta.setText(tfStr);//会重写设置文本域值,而不是追加
ta.append(tfStr + "\r\n");
tf.setText("");
tf.requestFocus();
}
});
//窗体监听关闭
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setVisible(true);
}
}
通过鼠标移动到按钮上更改背景色案例(鼠标事件)
代码实现:
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class FrameDemo4 {
public static void main(String[] args) {
Frame f = new Frame("更改背景色");
f.setLayout(new FlowLayout());
f.setBounds(400, 200, 400, 300);
//创建三个有不同功能的按钮
Button redButton = new Button("红色");
Button greenButton = new Button("绿色");
Button blueButton = new Button("蓝色");
//添加这三个按钮
f.add(redButton);
f.add(greenButton);
f.add(blueButton);
//为这三个按钮添加鼠标事件
redButton.addMouseListener(new MouseAdapter() {
@Override
//鼠标移入
public void mouseEntered(MouseEvent e) {
f.setBackground(Color.red);
}
});
redButton.addMouseListener(new MouseAdapter() {
@Override
//鼠标移出
public void mouseExited(MouseEvent e) {
f.setBackground(Color.white);
}
});
blueButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
f.setBackground(Color.blue);
}
});
blueButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
f.setBackground(Color.white);
}
});
greenButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
f.setBackground(Color.green);
}
});
greenButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
f.setBackground(Color.white);
}
});
//监听窗口关闭
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setVisible(true);
}
}
控制文本框内只能输入数字字符(键盘录入事件)
代码实现:
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo5 {
public static void main(String[] args) {
Frame f = new Frame("文本框只能录入数字");
f.setLayout(new FlowLayout());
f.setBounds(400, 200, 400, 300);
Label l = new Label("请输入你的手机号码,你只能按数字,不信你试试");
TextField tf = new TextField(40);
f.add(l);
f.add(tf);
tf.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//获取从键盘录入的每一个字符
char ch = e.getKeyChar();
if(!(ch >= '0' && ch <= '9')){
//提示框
JOptionPane.showMessageDialog(f, "请输入数字");
//使用此事件,以便不会按照默认方式由产生此事件的源代码来处理此事件
e.consume();
}
}
});
//监听窗口关闭
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setVisible(true);
}
}
二级菜单
代码实现如下(二级会了,一级,多级菜单应该都会了吧):
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
public class FrameDemo6 {
public static void main(String[] args) {
Frame f = new Frame("二级菜单");
f.setLayout(new FlowLayout());
f.setBounds(400, 200, 400, 300);
//创建菜单栏
MenuBar mb = new MenuBar();
//创建菜单
Menu m = new Menu("菜单");
Menu m1 = new Menu("系统功能");
//创建菜单项
MenuItem mi1 = new MenuItem("打开记事本");
MenuItem mi2 = new MenuItem("打开dos界面");
MenuItem mi3= new MenuItem("打开画图工具");
MenuItem mi4= new MenuItem("退出系统");
//添加菜单项到菜单
m1.add(mi1);
m1.add(mi2);
m1.add(mi3);
m.add(m1);
m.add(mi4);
//添加菜单到菜单栏
mb.add(m);
//添加菜单栏到窗体
f.setMenuBar(mb);
mi1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Runtime r = Runtime.getRuntime();
try {
r.exec("notepad");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
mi2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Runtime r = Runtime.getRuntime();
try {
r.exec("cmd");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
mi3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Runtime r = Runtime.getRuntime();
try {
r.exec("mspaint");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
mi4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
//监听窗口关闭
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setVisible(true);
}
}
设置窗体图标并设置窗体居中
示例代码(工具包Toolkit的使用):
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo7 {
public static void main(String[] args) {
Frame f = new Frame("修改窗体图标");
f.setLayout(new FlowLayout());
f.setSize(400, 300);
//获取默认工具包
Toolkit tk = Toolkit.getDefaultToolkit();
//根据路径获取地址
Image i = tk.getImage("src\\cn\\luyi\\demo1\\1.png");
//给窗体设置图片
f.setIconImage(i);
//获取屏幕宽高
Dimension d = tk.getScreenSize();
double screenWidth = d.getWidth();
double screenHeight = d.getHeight();
//获取窗体的宽高
int frameWidth = f.getWidth();
int frameHeight = f.getHeight();
//获取新的宽高作为坐标值,就是使得窗体居中的坐标了
int width = (int)(screenWidth - frameWidth) / 2;
int height= (int)(screenHeight - frameHeight) / 2;
f.setLocation(width, height);
//监听窗口关闭
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setVisible(true);
}
}
作者:卢一
出处:http://www.cnblogs.com/luyi001/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。