黑马程序员——黑马学习日志之十六 GUI
2014-07-03 00:15
411 查看
------- android培训、java培训、期待与您交流!
----------
黑马学习日志之十六 GUI
1 GUI
GUI 图形用户界面 Graphical User Interface 用图形的方式来显示计算机操作的界面,这样更方便更直观
CLI 命令行用户接口Command line User Interfance 就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观
Java为GUI提供的对象都存在Java.Awt和Javax.Swing两个包中。
2、Awt和Swing
Awt 抽象窗口工具包Abstract Window ToolKit,属于重量级控件,需要调用本地系统方法。 跨平台性不强
Swing 在AWT的基础上,建立的一套图形界面系统。其中提供了更多的组件,而且完全由 Java实现。增强了移植性,属轻量级控件。跨平台。
Swt Eclipse用的外观包。
3 Component 组件
Button按钮
Lable标签 封装文字
Checkbox复选框
TextComponet文本组件
Text 文本区域 多行文本
TextFiled文本框 单行文本
Container容器
panel面板
Window窗口
Frame框架
dialog对话框
FileDialog文件对话框
Container:为容器,是一个特殊的组件,给组件中可以通过add方法添加其他组件进来
4 布局
布局:容器中的组件的排放方式,就是布局
常见的布局管理器:
FlowLayout(流式布局管理器):从左到右的顺序排列。Panel默认布局管理器
BorderLayout(边界布局管理器):东,南,西,北,中。Frame默认布局管理器
GridLayout(网格布局管理器):规则的矩阵
CardLayout(卡片布局管理器):选项卡
GridBagLayout(网格包布局管理器):非规则的矩阵
坐标式布局:如果窗体中多个布局,可以先用面板划分区域,然后面板里创建布局。
5 构建窗体
component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。典型图形用户界面中的按钮、复选框和滚动条都是组件示例。
Component 类是与菜单不相关的 Abstract Window Toolkit 组件的抽象超类。还可以直接扩展类 Component 来创建一个轻量级组件。轻量级组件是与本机不透明窗口不相关的组件。
Container容器 有add方法Component add(Component comp, int index)
容器当中有个集合,集合是有脚标,是可以添加对象的
创建图形化界面:
1.创建frame窗体
2.对窗体进行基本设置比如大小,位置,布局
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示。通过setVisible(true)
import java.awt.*;
class AwtDemo
{
public static void main(String [] args){
Frame f = new Frame("my awt");
f.setSize(400,200);//设置窗体大小
f.setLocation(300,200);//设置窗体顶点的坐标
f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
Butt
4000
on b = new Button("按钮");
f.add(b);//添加按钮组件
f.setVisible(true);//设置窗体可以
System.out.println("hello world");
//图形化界面开启之后就多了一个线程 而这里输出语句是主线程
}
}
6 事件监听机制
事件监听机制特点:
事件源 ;事件 ;监听器,封装有外部动作 ;事件处理
事件源(组件):就是awt包或者swing包中的那些图形界面组件
事件(Event):每一个事件源都有自己的特有的对应事件和共性事件(例如鼠标键盘事件)
监听器(Listener):将可以触发某一个事件的动作(不只一个动作)都已经封装到监听器中
以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情是,就是对产生的动作进行处理。就是我们最重要的部分。
7 窗体事件
窗体事件:WindowEvent,窗体打开、关闭、正在关闭、激活、最小化等。
import java.awt.*;//只导入组件 需要导入事件
import java.awt.event.*;//导入事件
class AwtDemoclose
{
public static void main(String [] args){
Frame f = new Frame("my awt");
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体顶点的坐标
f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
Button b = new Button("我是一个按钮");
f.add(b);//添加按钮组件
f.addWindowListener(new MyWin());//添加窗体监听器
f.setVisible(true);//设置窗体可以
}
}
//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口
//并覆盖了其中的所有方法。只要继承自Windowadapter覆盖需要的方法即可
class MyWin extends WindowAdapter
{
publicvoidwindowClosing(WindowEvente){
System.out.println("关闭");//此方法只是控制台显示,没有实际关闭
System.out.println("guanbi ---"+e.toString());//打印出事件的信息
System.exit(0);
}
}
采用匿名内部类
import java.awt.*;//只导入组件 需要倒入事件
import java.awt.event.*;//导入事件
class AwtDemoclose2
{
public static void main(String [] args){
Frame f = new Frame("my awt");
f.setSize(400,300);//设置窗体大小
f.setLocation(300,200);//设置窗体顶点的坐标
f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
Button b = new Button("按钮");
f.add(b);//添加按钮
//匿名内部类的方式
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("guanbi");
System.exit(0);
}
public void windowActivated(WindowEvent e){
System.out.println("jihuo");
}
public void windowOpened(WindowEvent e){
System.out.println("open");
}
});
f.setVisible(true);//设置窗体可以
}
}
8 Action事件
//可以将awt中的组件布局和事件分开来处理
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
private Frame f;//可以将引用作用在整个类
private Button but;
FrameDemo(){
init(); //frame 一初始化 就有个设计好的图性界面
}
public void init(){//对图形化界面进行初始化,将图像界面和事件分离开来
f= new Frame("my frame" );
//对frame进行基本设置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("mybutton");
//将组件添加到组件frame中
f.add(but);
//加载一下窗体上的事件 调用方法
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){//将事件和图形化界面分开
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//让按钮具备退出程序的功能
/*
按钮就是事件源
那么选择哪个监听器呢?
通过关闭窗体实例了解到,想要知道哪个组件具备什么样的特有监听器
需要查看该组件对象的功能
通过查阅button的描述,发现按钮支持一个特有的监听器addActionListener
注意:此ActionListener监听器是3个监听器中不需要适配器的接口 几乎监听器都有适配器 适配器中方法超过3的
注意;都有适配器 适配器干吗的 就是创建监听器对象用的 只需覆盖其中的需要的方法即可
*/
//下面的活动监听器只有一个方法 将其覆盖即可
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.out.println("按钮叫我退出");
System.exit(0);
}
});
}
public static void main(String [] args){
new FrameDemo();
}
}
9 鼠标事件
鼠标事件:MouseEvent,鼠标按下、抬起、进入、移出等。
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
private Frame f;
private Button but;
MouseAndKeyEvent(){
init();
}
public void init(){
f= new Frame("my frame" );
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("mybutton");
//将组件添加到组件frame中
f.add(but);
//加载一下窗体上的事件 调用方法
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){//将事件单独写出来 和图形化界面分开
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.out.println("action ok");
}
});
but.addMouseListener(new MouseAdapter(){
private int count = 1;
private int clickCount =1;
public void mouseEntered(MouseEvent me){
System.out.println("鼠标进入组件"+count++);
}
//注意 按钮添加事件时一般是活动事件 鼠标点击 键盘按都是活动事件
//而鼠标事件只是更具体的事件 执行时先执行点击 再action活动
public void mouseClicked(MouseEvent me){
System.out.println("点击动作"+clickCount++);
}
});
}
public static void main(String [] args){
new MouseAndKeyEvent();
}
}
10 键盘事件
键盘监听器有三个方法 肯定有键盘适配器 KeyAdapter
void keyPressed(KeyEvent e) 按下某个键时调用此方法
void keyReleased(KeyEvent e) 释放某个键时调用此方法
void keyTyped(KeyEvent e) 键入某个键时调用此方法
例子:
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent1
{
private Frame f;
private Button but;
MouseAndKeyEvent1(){
init();
}
public void init(){
f= new Frame("my frame" );
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("mybutton");
//将组件添加到组件frame中
f.add(but);
//加载一下窗体上的事件 调用方法
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){//将事件单独写出来 和图形化界面分开
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.out.println("action ok");
//System.exit(0);
}
});
but.addMouseListener(new MouseAdapter(){
private int count = 1;
private int clickCount =1;
public void mouseEntered(MouseEvent me){
System.out.println("鼠标进入组件"+count++);
}
//注意 按钮加事件时一般是活动事件 鼠标点击 键盘按都是活动事件
//而鼠标事件只是更具体的事件 执行时先执行点击 再action活动
public void mouseClicked(MouseEvent me){
if(me.getClickCount()==2)
System.out.println("双击动作"+clickCount++);
}
});
//给but按钮添加一个键盘监听
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){//摁下键 事件会封装按下什么键
if(e.getKeyCode()==KeyEvent.VK_ENTER)
System.exit(0);
//还可以用组合键来结束 但是该KeyEvent事件没有组合键 找其父类 InputEvent 发现isControlDown ctl是否按下
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER){
System.out.println("ctrl+enter is run");
}
System.out.println(e.getKeyChar()+"...."+e.getKeyCode());
//注意:此处按钮必须是当前事件源才能键入 当前事件源就是按钮上有虚线
//而且实际中输入是中文时没法键入 改为英文可以输入 字符可以输入 字符串显示不出
System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
}
});
}
public static void main(String [] args){
new MouseAndKeyEvent1();
}
}
11 对话框 dialog
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo3
{
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
private Dialog d;//优化内存的话 应该写在该初始化的地方本段else中 这里为了代码好看
private Label lab;
private Button okBut;
MyWindowDemo3(){
init();
}
public void init(){
f = new Frame("my window");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(60);
but = new Button("转到");
ta = new TextArea(25,70);//参数是行 列 TextArea(String text)里面有一些文字初始化时
//加上对话框
d = new Dialog(f,"提示信息-self",true);//默认边界布局 true意思是该对话框在顶端 必须操作了该对话框才能操作窗体
d.setBounds(400,200,240,150);
d.setLayout(new FlowLayout());
lab = new Label(); //因为不知道有什么信息所以没初始化信息
okBut = new Button("确定");
d.add(lab);
d.add(okBut);
//d不需要以初始化就显示 因为是提示信息的
f.add(tf);
f.add(but);
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//按钮是事件源 即操作文本框 又操作文本内容
//tf没有获取的文本内容的方法 去其父类看TextComponent的方法 有增加文本内容方法
but.addActionListener(new ActionListener(){//不能是鼠标点击 因为键盘按下也可以 所以用ActionEvent
public void actionPerformed(ActionEvent e){
showDir();
}
} );
d.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
d.setVisible(false);//这里是对话框隐藏 不是退出程序 关闭不一定退出程序
}
});
//okBut的效果也是对话框隐藏 不是退出程序
okBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
d.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ENTER)
{
showDir();
}
}
});
}
private void showDir(){
String dirPath = tf.getText();
File dir = new File(dirPath);
if (dir.exists() && dir.isDirectory())
{
ta.setText("");
String [] names = dir.list();
for(String name : names){
//ta.setText(name+"\r\n");//这里会进一个名字会覆盖一个名字 可以考虑StringBuilder 但要先看其有没有对应方法
ta.append(name+"\r\n");
}
}
else{
String info = "你输入的信息:"+dirPath+"是错误的。请重输入";
lab.setText(info);
d.setVisible(true);
}
}
public static void main(String [] args){
new MyWindowDemo3();
}
}
12 菜单 Menu
MenuBar菜单栏或者菜单条
MenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。
Menu菜单
Menu 对象是从菜单栏部署的下拉式菜单组件。
MenuItem
菜单中的所有项必须属于类 MenuItem 或其子类之一。默认的 MenuItem 对象包含一个简单的加标签的菜单项。
菜单是支持键盘的操作的 所以用活动监听
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
private Frame f;
private MenuBar mb;
private Menu m,subMenu;
private MenuItem closeItem,subItem;
MyMenuDemo(){
init();
}
public void init(){
f = new Frame("wwwindow");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
mb = new MenuBar();
m = new Menu("文件");
subMenu = new Menu("子菜单");
subItem = new MenuItem("子条目");
closeItem = new MenuItem("退出");
subMenu.add(subItem);
m.add(subMenu);
m.add(closeItem);
mb.add(m);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
closeItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
}
public static void main(String [] args){
new MyMenuDemo();
}
}
13 jar包双击执行
类多了,就要封装,可以将类放在一个包中,即在源码的开头加个包 package sun;
然后在dos命令行中输入javac -d f:\test MyTest.java,就可以发现F盘下test 出现了sun
然后切换到f盘下test 将sun打成jar包:jar -cvf mytest.jar sun 将sun文件 打包成mytest.jar 但是发现双击是不能执行的
我们要通过配置文件告诉双击执行先执行Main-class类
新建个文件,名字可以随便起 例如起个s.txt
Main-Class:(这里必须空格) sun.MyTest(这里必须写回车)
空格原因 就是前后能形成键值对 要不就是无效的 会发生IO读取异常 无效头字段
回车原因 只有回车了才会默认是结束标志 配置是配不进去的
输入 jar -cvfm mytest.jar s.txt sun
注意:jar文件必须在本地注册过才能用
工具--〉文件夹选项--〉文件类型--〉新建--〉jar--〉选择图标--〉新建open--〉浏览bin目录javaw.exe
------- android培训、java培训、期待与您交流!
----------
----------
黑马学习日志之十六 GUI
1 GUI
GUI 图形用户界面 Graphical User Interface 用图形的方式来显示计算机操作的界面,这样更方便更直观
CLI 命令行用户接口Command line User Interfance 就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观
Java为GUI提供的对象都存在Java.Awt和Javax.Swing两个包中。
2、Awt和Swing
Awt 抽象窗口工具包Abstract Window ToolKit,属于重量级控件,需要调用本地系统方法。 跨平台性不强
Swing 在AWT的基础上,建立的一套图形界面系统。其中提供了更多的组件,而且完全由 Java实现。增强了移植性,属轻量级控件。跨平台。
Swt Eclipse用的外观包。
3 Component 组件
Button按钮
Lable标签 封装文字
Checkbox复选框
TextComponet文本组件
Text 文本区域 多行文本
TextFiled文本框 单行文本
Container容器
panel面板
Window窗口
Frame框架
dialog对话框
FileDialog文件对话框
Container:为容器,是一个特殊的组件,给组件中可以通过add方法添加其他组件进来
4 布局
布局:容器中的组件的排放方式,就是布局
常见的布局管理器:
FlowLayout(流式布局管理器):从左到右的顺序排列。Panel默认布局管理器
BorderLayout(边界布局管理器):东,南,西,北,中。Frame默认布局管理器
GridLayout(网格布局管理器):规则的矩阵
CardLayout(卡片布局管理器):选项卡
GridBagLayout(网格包布局管理器):非规则的矩阵
坐标式布局:如果窗体中多个布局,可以先用面板划分区域,然后面板里创建布局。
5 构建窗体
component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。典型图形用户界面中的按钮、复选框和滚动条都是组件示例。
Component 类是与菜单不相关的 Abstract Window Toolkit 组件的抽象超类。还可以直接扩展类 Component 来创建一个轻量级组件。轻量级组件是与本机不透明窗口不相关的组件。
Container容器 有add方法Component add(Component comp, int index)
容器当中有个集合,集合是有脚标,是可以添加对象的
创建图形化界面:
1.创建frame窗体
2.对窗体进行基本设置比如大小,位置,布局
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示。通过setVisible(true)
import java.awt.*;
class AwtDemo
{
public static void main(String [] args){
Frame f = new Frame("my awt");
f.setSize(400,200);//设置窗体大小
f.setLocation(300,200);//设置窗体顶点的坐标
f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
Butt
4000
on b = new Button("按钮");
f.add(b);//添加按钮组件
f.setVisible(true);//设置窗体可以
System.out.println("hello world");
//图形化界面开启之后就多了一个线程 而这里输出语句是主线程
}
}
6 事件监听机制
事件监听机制特点:
事件源 ;事件 ;监听器,封装有外部动作 ;事件处理
事件源(组件):就是awt包或者swing包中的那些图形界面组件
事件(Event):每一个事件源都有自己的特有的对应事件和共性事件(例如鼠标键盘事件)
监听器(Listener):将可以触发某一个事件的动作(不只一个动作)都已经封装到监听器中
以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情是,就是对产生的动作进行处理。就是我们最重要的部分。
7 窗体事件
窗体事件:WindowEvent,窗体打开、关闭、正在关闭、激活、最小化等。
import java.awt.*;//只导入组件 需要导入事件
import java.awt.event.*;//导入事件
class AwtDemoclose
{
public static void main(String [] args){
Frame f = new Frame("my awt");
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体顶点的坐标
f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
Button b = new Button("我是一个按钮");
f.add(b);//添加按钮组件
f.addWindowListener(new MyWin());//添加窗体监听器
f.setVisible(true);//设置窗体可以
}
}
//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口
//并覆盖了其中的所有方法。只要继承自Windowadapter覆盖需要的方法即可
class MyWin extends WindowAdapter
{
publicvoidwindowClosing(WindowEvente){
System.out.println("关闭");//此方法只是控制台显示,没有实际关闭
System.out.println("guanbi ---"+e.toString());//打印出事件的信息
System.exit(0);
}
}
采用匿名内部类
import java.awt.*;//只导入组件 需要倒入事件
import java.awt.event.*;//导入事件
class AwtDemoclose2
{
public static void main(String [] args){
Frame f = new Frame("my awt");
f.setSize(400,300);//设置窗体大小
f.setLocation(300,200);//设置窗体顶点的坐标
f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
Button b = new Button("按钮");
f.add(b);//添加按钮
//匿名内部类的方式
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("guanbi");
System.exit(0);
}
public void windowActivated(WindowEvent e){
System.out.println("jihuo");
}
public void windowOpened(WindowEvent e){
System.out.println("open");
}
});
f.setVisible(true);//设置窗体可以
}
}
8 Action事件
//可以将awt中的组件布局和事件分开来处理
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
private Frame f;//可以将引用作用在整个类
private Button but;
FrameDemo(){
init(); //frame 一初始化 就有个设计好的图性界面
}
public void init(){//对图形化界面进行初始化,将图像界面和事件分离开来
f= new Frame("my frame" );
//对frame进行基本设置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("mybutton");
//将组件添加到组件frame中
f.add(but);
//加载一下窗体上的事件 调用方法
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){//将事件和图形化界面分开
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//让按钮具备退出程序的功能
/*
按钮就是事件源
那么选择哪个监听器呢?
通过关闭窗体实例了解到,想要知道哪个组件具备什么样的特有监听器
需要查看该组件对象的功能
通过查阅button的描述,发现按钮支持一个特有的监听器addActionListener
注意:此ActionListener监听器是3个监听器中不需要适配器的接口 几乎监听器都有适配器 适配器中方法超过3的
注意;都有适配器 适配器干吗的 就是创建监听器对象用的 只需覆盖其中的需要的方法即可
*/
//下面的活动监听器只有一个方法 将其覆盖即可
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.out.println("按钮叫我退出");
System.exit(0);
}
});
}
public static void main(String [] args){
new FrameDemo();
}
}
9 鼠标事件
鼠标事件:MouseEvent,鼠标按下、抬起、进入、移出等。
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
private Frame f;
private Button but;
MouseAndKeyEvent(){
init();
}
public void init(){
f= new Frame("my frame" );
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("mybutton");
//将组件添加到组件frame中
f.add(but);
//加载一下窗体上的事件 调用方法
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){//将事件单独写出来 和图形化界面分开
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.out.println("action ok");
}
});
but.addMouseListener(new MouseAdapter(){
private int count = 1;
private int clickCount =1;
public void mouseEntered(MouseEvent me){
System.out.println("鼠标进入组件"+count++);
}
//注意 按钮添加事件时一般是活动事件 鼠标点击 键盘按都是活动事件
//而鼠标事件只是更具体的事件 执行时先执行点击 再action活动
public void mouseClicked(MouseEvent me){
System.out.println("点击动作"+clickCount++);
}
});
}
public static void main(String [] args){
new MouseAndKeyEvent();
}
}
10 键盘事件
键盘监听器有三个方法 肯定有键盘适配器 KeyAdapter
void keyPressed(KeyEvent e) 按下某个键时调用此方法
void keyReleased(KeyEvent e) 释放某个键时调用此方法
void keyTyped(KeyEvent e) 键入某个键时调用此方法
例子:
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent1
{
private Frame f;
private Button but;
MouseAndKeyEvent1(){
init();
}
public void init(){
f= new Frame("my frame" );
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("mybutton");
//将组件添加到组件frame中
f.add(but);
//加载一下窗体上的事件 调用方法
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){//将事件单独写出来 和图形化界面分开
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.out.println("action ok");
//System.exit(0);
}
});
but.addMouseListener(new MouseAdapter(){
private int count = 1;
private int clickCount =1;
public void mouseEntered(MouseEvent me){
System.out.println("鼠标进入组件"+count++);
}
//注意 按钮加事件时一般是活动事件 鼠标点击 键盘按都是活动事件
//而鼠标事件只是更具体的事件 执行时先执行点击 再action活动
public void mouseClicked(MouseEvent me){
if(me.getClickCount()==2)
System.out.println("双击动作"+clickCount++);
}
});
//给but按钮添加一个键盘监听
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){//摁下键 事件会封装按下什么键
if(e.getKeyCode()==KeyEvent.VK_ENTER)
System.exit(0);
//还可以用组合键来结束 但是该KeyEvent事件没有组合键 找其父类 InputEvent 发现isControlDown ctl是否按下
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER){
System.out.println("ctrl+enter is run");
}
System.out.println(e.getKeyChar()+"...."+e.getKeyCode());
//注意:此处按钮必须是当前事件源才能键入 当前事件源就是按钮上有虚线
//而且实际中输入是中文时没法键入 改为英文可以输入 字符可以输入 字符串显示不出
System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
}
});
}
public static void main(String [] args){
new MouseAndKeyEvent1();
}
}
11 对话框 dialog
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo3
{
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
private Dialog d;//优化内存的话 应该写在该初始化的地方本段else中 这里为了代码好看
private Label lab;
private Button okBut;
MyWindowDemo3(){
init();
}
public void init(){
f = new Frame("my window");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(60);
but = new Button("转到");
ta = new TextArea(25,70);//参数是行 列 TextArea(String text)里面有一些文字初始化时
//加上对话框
d = new Dialog(f,"提示信息-self",true);//默认边界布局 true意思是该对话框在顶端 必须操作了该对话框才能操作窗体
d.setBounds(400,200,240,150);
d.setLayout(new FlowLayout());
lab = new Label(); //因为不知道有什么信息所以没初始化信息
okBut = new Button("确定");
d.add(lab);
d.add(okBut);
//d不需要以初始化就显示 因为是提示信息的
f.add(tf);
f.add(but);
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//按钮是事件源 即操作文本框 又操作文本内容
//tf没有获取的文本内容的方法 去其父类看TextComponent的方法 有增加文本内容方法
but.addActionListener(new ActionListener(){//不能是鼠标点击 因为键盘按下也可以 所以用ActionEvent
public void actionPerformed(ActionEvent e){
showDir();
}
} );
d.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
d.setVisible(false);//这里是对话框隐藏 不是退出程序 关闭不一定退出程序
}
});
//okBut的效果也是对话框隐藏 不是退出程序
okBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
d.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ENTER)
{
showDir();
}
}
});
}
private void showDir(){
String dirPath = tf.getText();
File dir = new File(dirPath);
if (dir.exists() && dir.isDirectory())
{
ta.setText("");
String [] names = dir.list();
for(String name : names){
//ta.setText(name+"\r\n");//这里会进一个名字会覆盖一个名字 可以考虑StringBuilder 但要先看其有没有对应方法
ta.append(name+"\r\n");
}
}
else{
String info = "你输入的信息:"+dirPath+"是错误的。请重输入";
lab.setText(info);
d.setVisible(true);
}
}
public static void main(String [] args){
new MyWindowDemo3();
}
}
12 菜单 Menu
MenuBar菜单栏或者菜单条
MenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。
Menu菜单
Menu 对象是从菜单栏部署的下拉式菜单组件。
MenuItem
菜单中的所有项必须属于类 MenuItem 或其子类之一。默认的 MenuItem 对象包含一个简单的加标签的菜单项。
菜单是支持键盘的操作的 所以用活动监听
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
private Frame f;
private MenuBar mb;
private Menu m,subMenu;
private MenuItem closeItem,subItem;
MyMenuDemo(){
init();
}
public void init(){
f = new Frame("wwwindow");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
mb = new MenuBar();
m = new Menu("文件");
subMenu = new Menu("子菜单");
subItem = new MenuItem("子条目");
closeItem = new MenuItem("退出");
subMenu.add(subItem);
m.add(subMenu);
m.add(closeItem);
mb.add(m);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
closeItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
}
public static void main(String [] args){
new MyMenuDemo();
}
}
13 jar包双击执行
类多了,就要封装,可以将类放在一个包中,即在源码的开头加个包 package sun;
然后在dos命令行中输入javac -d f:\test MyTest.java,就可以发现F盘下test 出现了sun
然后切换到f盘下test 将sun打成jar包:jar -cvf mytest.jar sun 将sun文件 打包成mytest.jar 但是发现双击是不能执行的
我们要通过配置文件告诉双击执行先执行Main-class类
新建个文件,名字可以随便起 例如起个s.txt
Main-Class:(这里必须空格) sun.MyTest(这里必须写回车)
空格原因 就是前后能形成键值对 要不就是无效的 会发生IO读取异常 无效头字段
回车原因 只有回车了才会默认是结束标志 配置是配不进去的
输入 jar -cvfm mytest.jar s.txt sun
注意:jar文件必须在本地注册过才能用
工具--〉文件夹选项--〉文件类型--〉新建--〉jar--〉选择图标--〉新建open--〉浏览bin目录javaw.exe
------- android培训、java培训、期待与您交流!
----------
相关文章推荐
- 黑马程序员——黑马学习日志之四 Java基础——数组
- 黑马程序员——黑马学习日志之九 多线程
- 黑马程序员——黑马学习日志之五 面向对象,类,函数,匿名对象,封装,构造函数,this,代码块
- 黑马程序员——黑马学习日志之二十二 Java高新技术(四)
- 黑马程序员——黑马学习日志之二十五 交通灯管理系统
- 黑马程序员——黑马学习日志之七 抽象类,接口,内部类,包
- 黑马程序员——黑马学习日志之二十 Java高新技术(二)
- 黑马程序员——黑马学习日志之十二 IO流(一)
- 黑马程序员——黑马学习日志之二 Java基础02
- 黑马程序员——黑马学习日志之八 异常
- 黑马程序员——黑马学习日志之十七 网络编程
- 黑马程序员——黑马学习日志之十八 正则表达式
- 黑马程序员--java基础 GUI画图学习日志
- 黑马程序员——黑马学习日志之二十四 Java高新技术(六)
- 黑马程序员——黑马学习日志之十四 IO流(三)
- 黑马程序员——黑马学习日志之十 集合(一)
- 黑马程序员——黑马学习日志之六 静态,单例设计模式,继承,多态
- 黑马程序员——黑马学习日志之三 Java基础03
- 黑马程序员——黑马学习日志之二十六 银行业务调度系统
- 黑马程序员——黑马学习日志之一 Java基础01