java基础知识之GUI
1.GUI 概述
全称:Graphical User Interface(图形用户接口)
作用:用图形的方式,来显示计算机操作的界面,这样更方便更直观。
常调用的包:Awt和Swing
java.Awt:抽象窗口工具包,需要调用本地系统方法实现功能。属于重量级控件。
java.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属于轻量级控件。
继承关系图:
2.常见的布局管理器
- FlowLayout(流式布局管理器):从左到右的顺序排列。Panel默认的布局管理器。
- BorderLayout(边界布局管理器)东,南,西,北,中。 Frame默认的布局管理器。
- GridLayout(网格布局管理器)规则的矩阵
- CardLayout(卡片布局管理器)选项卡
- GridBagLayout(网格包布局管理器)非规则的矩阵
创建图形化界面的步骤:
1.创建frame窗体并命名窗体;
2.对窗体进行基本设置(比如大小,位置,布局)
3.定义组件(按钮,文本组件、复选框等)
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示,通过setVisible(true)
举例说明:
class SwingDemo
{
public static void main(String[] args)
{
JFrame f = new JFrame();
f.setBounds(300,100,500,400);
f.setLayout(new FlowLayout());
JButton but = new JButton("我是一个按钮");
f.add(but);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
f.setVisible(true);
}
}
3.事件监听机制
事件监听机制组成
事件源(组件):就是awt包或者swing包中的那些图形界面组件。
事件(Event):每一个事件源都有自己特有的对应事件和共性事件。
监听器(Listener):将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
以上三者,在java中都已经定义好了。直接获取其对象来用就可以了
事件处理(引发事件后处理方式):就是对产生的动作进行处理的方法。
事件监听机制流程图
例如:
class MyWinextends WindowAdapter{
publicvoid windowClosing(WindowEvent e){
System.out.println("hahahha");
System.exit(0);
}
}
publicclass FrameDemo {//如果写成内部类的形式那么前面必须加上public static,因为主方法是静态的,不能调用动态类或者方法
publicstaticvoid main(String[] args) {
//设置窗体
Frame f =new Frame("窗体");
f.setSize(400, 300);
f.setLocation(500, 300);//距离左侧,距离上面
/**可以用这个方法一次性设置
* setBounds(int x,int y,int width,int height)移动组件并调整其大小。
*/
Button b =new Button("按钮");
Button b2 =new Button("按钮2");
TextField tf =new TextField(20);
f.add(b);//把按钮添加到窗体上
f.add(b2);//把按钮添加到窗体上
f.add(tf);//在窗体上的的顺序按照添加的顺序
f.setLayout(new FlowLayout());//设置容器的布局管理器
//f.addWindowListener(new MyWin());
b.addActionListener(new ActionListener(){//通过匿名内部类,方便 添加动作监听器
publicvoid actionPerformed(ActionEvent e) {
System.out.println("按钮把界面关闭了");
//System.exit(0);
}
});
//鼠标
b.addMouseListener(new MouseAdapter() {//鼠标动作监听器
intcount = 1;
publicvoid mouseEntered(MouseEvent e){
System.out.println("鼠标进入"+(count++)+"次!");
}
});
b.addMouseListener(new MouseAdapter(){//和上面的一样,可以写在一起
intclickCount = 1;
publicvoid mouseClicked(MouseEvent e){
if(e.getClickCount() == 2){
System.out.println("双击动作"+clickCount++);
}
}
});
/*
f.addWindowListener(new WindowAdapter()//匿名内部类的写法
{
public void windowClosing(WindowEvent e)
{
System.out.println("我关");
System.exit(0);
}
public void windowActivated(WindowEvent e)
{
System.out.println("我活了。");
}
public void windowOpened(WindowEvent e)
{
System.out.println("我被打开了,hahahhahah");
}
});*/
//键盘:
b2.addKeyListener(new KeyAdapter() {
publicvoid keyPressed(KeyEvent e)
{
System.out.println("键盘的作用");//用鼠标按没反应,
System.out.println(e.getKeyChar()+"---"+e.getKeyCode());//f---70等、
if(e.getKeyCode() == 27){//按住esc键退出
System.out.println("ESC键把我关闭了!");
System.exit(0);
}
//组合键去关闭 CTRL + ENTER
if(e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER){
System.out.println("CTRL + ENTER组合键把我关闭了!");
System.exit(0);
}
}
});
//文本框
tf.addKeyListener(new KeyAdapter() {
publicvoid keyPressed(KeyEvent e){
if(!(e.getKeyCode()>=KeyEvent.VK_0 && e.getKeyCode()<=KeyEvent.VK_9)){
System.out.println(e.getKeyChar()+"不符合是数字!");
}
}
});
f.setVisible(true);//设置可见性
}
}
例://列出文件夹内全部的文件
class MyFrame {
private Frame f;
private Button b;
private TextField tf;
private TextArea ta;
MyFrame() {
init();
}
void init() {
f = new Frame("我的电脑");
f.setBounds(300, 100, 600, 500);
f.setLayout(new FlowLayout());
b = new Button("转到");
tf = new TextField(60);
ta = new TextArea(25, 70);
f.add(tf);
f.add(b);
f.add(ta);
f.setVisible(true);
action();
}
//窗体上的操作
void action() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
buttonAction();
keyAction();
}
void keyAction(){
//设置键盘监听器,当输入enter键的时候实现和点击鼠标同样的功能!
b.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
//if(e.getKeyCode() == 10){
//buttonAction();
//}
String dirPath = tf.getText();// 获取文本(我们想验证的是路径),接下来获取文件
File file = new File(dirPath);// 获取文件
if (file.exists() && file.isDirectory()) {// 判断,存在否以及是否是文件夹
ta.setText("");// 如果符合条件的话,清空以前的数据;
String[] names = file.list();
for (String name : names) {
ta.append(name + "\r\n");
}
System.out.println("=======");
} else {
ta.setText("");
ta.append("对不起,请确认您输入的是路径!");
}
System.out.println(e.getKeyCode());
}
});
tf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String dirPath = tf.getText();// 获取文本(我们想验证的是路径),接下来获取文件
File file = new File(dirPath);// 获取文件
if (file.exists() && file.isDirectory()) {// 判断,存在否以及是否是文件夹
ta.setText("");// 如果符合条件的话,清空以前的数据;
String[] names = file.list();
for (String name : names) {
ta.append(name + "\r\n");
}
System.out.println("=======");
} else {
ta.setText("");
ta.append("对不起,请确认您输入的是路径!");
}
}
});
}
void buttonAction() {
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String dirPath = tf.getText();// 获取文本(我们想验证的是路径),接下来获取文件
File file = new File(dirPath);// 获取文件
if (file.exists() && file.isDirectory()) {// 判断,存在否以及是否是文件夹
ta.setText("");// 如果符合条件的话,清空以前的数据;
String[] names = file.list();
for (String name : names) {
ta.append(name + "\r\n");
}
System.out.println("=======");
} else {
ta.setText("");
ta.append("对不起,请确认您输入的是路径!");
}
}
});
}
}
public class FrameDemo3 {
public static void main(String[] args) {
new MyFrame();
}
}
4.键盘事件
(1)KeyListener包含
KeyPressed(按下一瞬间的事件,表示虚拟键码即捕捉按键),能够调用e.getKeyCode()返回虚拟键码,
e.isShiftDown()等检测是否按下 shift。
KeyTyped(一直按着时的事件,表示在屏幕上出现的真实字符,如果按shift+a,则会为A),e.getKeyChar()返回真实字符
KeyReleased(放开一瞬间的事件)
(2)panel默认是不接受键盘事件的,需要在panel构造函数最后加setFocusable(true);激活
5.鼠标事件
(1)鼠标事件有3个监听器
MouseListener:有MousePressed(按下鼠标瞬间的事件),MouseReleased(松开鼠标瞬间的事件),
MouseClicked(主要是调用 e.getClickCount()获得鼠标点击次数)
MouseMotionListener:MouseMoved(鼠标平常移动),MouseDragged(鼠标按下后移动)
MouseWheelListener:MouseWheelMoved(鼠标滚轮移动)
(2)MouseEvent可以调用e.getX(),e.getY()返回鼠标的位置
(3)应用:实现画图板。
6.Action事件
(1)Action是扩展与ActionListener的接口,被AbstractAction实现。
(2)Action方法putValue(Strng key,Object value):这个方法可以在预先放置key-value对,由getValue(String key)获得
预定义的key中我认为最有用的也只有SHORT_DESCRIPTION,他的作用是当鼠标移到比如button上时,会显现一个简介,这就是SHORT_DESCRIPTION的作用。
7.菜单
继承体系
JMenuBar菜单栏 frame.setJMenuBar(menuBar);
JMenu 菜单对象 menuBar.add(menu);
JMenuItem菜单项 menu.add(menuItem); JMenuItem可以添加图标 JMenuItem i=new JMenuItem(String,new ImageIcon("..."));
JCheckBoxMenuItem多选框菜单项 menuItem.add(checkboxmenuItem);
JRadioButtonMenuItem单选框菜单项 需要有ButtonGroup
JMenu m1; JMenu m2; m1.add(m2);可以添加子菜单
menu.addSeperator(); //添加分割线