`
小驴变黑马
  • 浏览: 11307 次
文章分类
社区版块
存档分类

黑马学习日记_GUI图形化界面

阅读更多
---------------------- android开发java培训、期待与您交流! ----------------------
1、GUI基础概念
  GUI(Graphical  User  Interface 图形用户接口)。
  用图形的方式,来显示计算机操作的界面,这样更方便更直观。
 CLI (Command  Line  User  Interface命令行用户接口)
  就是常见的dos命令操作。
  需要记忆一些常用的命令,操作不直观。
举例:
  创建文件夹删除或删除文件夹(一个通过图形化界面操作一个通过dos命令操作)
        知识:
  Java为GUI提供的对象都存在   java.Awt   和  javax.Swing两个包中。
2、Awt 和 Swing 区别?
java.Awt:Abstract  Windows ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能,属重量级控件。(就是比较依赖于平台,根据系统的不同会有所差异。在Windows下编写的程序拿到Linus下运行界面会有所不同)。
javax.Swing :在AWT的基础上,建立的一套图形化界面系统,其中提供了更多的组件,而且完全由Java实现,增强了移植性,属轻量级控件。(通过Swing编写的界面在那个系统下都可以运行,跨平台性超强) 
4、 布局管理器
布局就是组件在容器中的排放方式(好比教室中桌椅的摆放方式);
使用图形化界面时一定要画草图。
常见的布局管理器:
FlowLayout(流式布局管理器)
从左到到右的顺序排列(第一个出现在中间的位置)
Panel 默认的布局管理器
BorderLayout(边界布局管理器)
东,南,西,北,中(麻将模式 默认居中 如果初始化时没有指定位置则以最大面积填充之后的覆盖)
Frame 默认的布局管理器
GridLayout(网络布局管理器)
规则的矩阵(例如计算器的布局)
CardLayout(卡片布局管理器)
选项卡方式的
GridBagLayout(网格包式布局管理器)
非规则的矩阵
坐标式布局(想放哪放哪)
 
5、Container中的一些方法?
Component   add (Component  comp)将指定组件追加到此容器的尾部。
Component   add (Component  comp ,int  index)将指定组件添加到此容器的给定位置上。
Frame中的构造函数:
Frame():构造一个最初不可见的 Frame 新实例()。
Frame(String  title):构造一个新的、最初不可见的、具有指定标题的 Frame 对象。
void    setVisible(boolean b)根据参数 b 的值显示或隐藏此组件
void   setSize(int width横坐标, int height纵坐标)调整组件的大小,使其宽度为 width,高度为 height
void  setLocation(int  x, int  y)将组件移到新位置
void  setLayout( LayoutManager   mgr) 设置此容器的布局管理器
import java.awt.*;
class GuiDemo 
{
public static void main(String[] args) 
{
Frame F = new Frame("我的java窗口");
F.setVisible(true);
F.setSize(500,300);
F.setLocation(500,200);
Button b = new Button("按钮");
F.add(b);//将按钮添加到窗体中
F.setLayout(new FlowLayout());//将窗体设置为流式布局的布局,默认是居中
}
}
 
6、事件监听机制?
事件监听机制的几个特点:
1、事件源(就是awt包或者swing包中的那些图形化界面组件)
2、事件(每一个事件源都有自己特有的对应事件和共性事件)
3、监听器(把可以触发某个事件的动作都,都已经封装到了监听器中)
4、事件处理(自己要编写的部分,就是对产生动作进行处理) 
 
7、窗体事件
方法:void  addWindowListener(WindowListener l)添加指定的窗口侦听器,以从此窗口接收窗口事件。
而该方法传入的是WindowListener,其中WindowListener 是一个接口,所以要复写WindowListener中的方法,比较麻烦,通过查看API发现WindowListener有一个抽象子类WindowAdapter它是一个空方法的类(其中的方法体都没有处理方式),所以通过自定义类去继承它覆写其中的方法。父类引用接受子类对象是可以的。通过匿名内部类也是可以的。
import java.awt.*;
import java.awt.event.*;
class GuiDemo 
{
public static void main(String[] args) 
{
Frame F = new Frame("我的java窗口");
F.setVisible(true);
F.setSize(500,300);
F.setLocation(500,200);
Button b = new Button("按钮");
F.add(b);//将按钮添加到窗体中
F.setLayout(new FlowLayout());//将窗体设置为流式布局的布局,默认是居中
   
//添加指定的窗口侦听器,以从此窗口接收窗口事件,父类引用指向子类对象
//子类继承方式:F.addWindowListener(new myWindowListener() );
//匿名内部类方式
F.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) 
{
System.out.println("能关闭吗");
System.exit(0);
}
} );
}   
}
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
//外部建立组件的引用
private Frame f;
private Button b;
//通过构造函数初始化
FrameDemo()
{
init();
}
 
public void  init()
{
//定义窗体
f=new Frame("我的java窗体");
//设置窗体属性
f.setBounds(300,400,300,400);//该方法是setSize()和setLocation()的结合
//初始化button并将button添加到窗体中
b=new Button("请按按钮");
f.add(b);
f.setLayout(new FlowLayout());
//加载窗体上的事件
myEvent();
//显示窗体
f.setVisible(true);
}
 
//定义事件
private void myEvent()
{
//给窗体添加监听器
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.out.println("窗体关闭操作运行");
System.exit(0);
}
});
 
//给按钮添加监听器
//按钮时事件源
//窗体用addWindowListener监听button怎么添加监听器呢
//通过查看API看到button选择的监听器是
//想要知道哪个组件具备什么样的特有监听,就查看该组件的API
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) 
{
System.out.println("按钮活动事件执行");
System.exit(0);
 
}
});
}
}
class ActionDemo  
{
public static void main(String[] args) 
{
System.out.println("生成窗体啦");
FrameDemo F = new FrameDemo();
}
}
  
9、鼠标事件
import java.awt.*;
import java.awt.event.*;
class fraemDemo
{
private Frame f;
private Button b;
fraemDemo()
{
init();
}
private void init()
{
f=new Frame("鼠标键盘事件窗口");
f.setBounds(100,200,200,100);
f.setLayout(new FlowLayout());
b=new Button("鼠标事件按钮");
f.add(b);
f.setVisible(true);
//添加事件
addEvent();
}
 
private void addEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.out.println("窗口关闭");
System.exit(0);
}
});
 
b.addMouseListener(new MouseAdapter()
{
public void mouseEntered(MouseEvent m)
{
System.out.println("鼠标在此经过");
}
public void mouseClicked(MouseEvent m)
{
if(m.getClickCount()==2)
System.out.println("双击动作执行");
}
 
 
});
}
}
 
class mouseAndKeyEvent 
{
public static void main(String[] args) 
{
 
new fraemDemo();
}
}
  
10、键盘事件
键盘KeyAdapter中需要覆写的方法
void    keyPressed(KeyEvent e) 
          按下某个键时调用此方法。
void    keyReleased(KeyEvent e) 
         释放某个键时调用此方法。 
  void    keyTyped(KeyEvent e) 
          键入某个键时调用此方法。 
键盘事件和其他事件用法相同 ,需要了解一下键盘事件对象中的一些方法
char   getKeyChar() 返回与此事件中的键关联的字符
int     getKeyCode() 返回与此事件中的键关联的整数 keyCode。
 
组合键
boolean isAltDown() 
          返回 Alt 修饰符在此事件上是否为 down。 
  boolean isAltGraphDown() 
          返回 AltGraph 修饰符在此事件上是否为 down。 
  boolean isConsumed() 
          返回是否已经使用此事件。 
  boolean isControlDown() 
          返回 Control 修饰符在此事件上是为 down。 
  boolean isMetaDown() 
         返回 Meta 修饰符在此事件上是否为 down。 
  boolean isShiftDown()
 返回 Shift 修饰符在此事件上是否为 down。
static String getKeyText(int keyCode) 
返回描述 keyCode 的 String,如 "HOME"、"F1" 或 "A"。
void consume() 
          使用此事件,以便不会按照默认的方式由产生此事件的源代码来处理此事件。
相关代码:
import java.awt.*;
import java.awt.event.*;
class KeyEventDemo  
{
private Frame f;
private Button b;
private TextField tf;
KeyEventDemo()
{
init();
}
 
private void init()
{
f = new Frame("键盘事件窗口");
b = new Button("按钮");
tf = new TextField(10);
 
f.setVisible(true);
f.setLayout(new FlowLayout());
f.setBounds(300,300,300,300);
f.add(tf);
f.add(b);
addEvent();
}
 
private void addEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
 
b.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent m)
{
System.out.println("按钮上的鼠标事件");
}
});
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent k)
{
int code =k.getKeyCode();
if(!(code >= 96 && code <=105))
{
System.out.println(code+"输入字母非法");
k.consume();
}
}
});
}
 
public static void main(String[] args) 
{
new KeyEventDemo();
}
}
  
11、练习——通过图形化界面列出指定目录下的文件
package one;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class AwtFileList 
{
private Frame f;
private Button b;
private TextField tf;
private TextArea ta;
AwtFileList()
{
init();
}
 
public void init()
{
f= new Frame("列出目录下清单");
f.setLayout(new FlowLayout());
b=new Button("转到");
tf=new TextField(41);
ta=new TextArea(20,40);
f.setBounds(200,200,400,400);
f.add(tf);
f.add(b);
f.add(ta);
addEvent();
f.setVisible(true);
 
}
 
public void addEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent w)
{
System.exit(0);
}
});
 
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent a)
{
String dir = tf.getText();
//tf.setText("");
File f = new File(dir);
if(f.exists() && f.isDirectory())
{
ta.setText("");//清空
String[] list = f.list();
for(String l : list)
{
ta.append(l+"\r\n");
}
}
else
{
//ta.setText("");
ta.setText("您输入的目录有误,请查看后继续操作");
}
}
});
}
public static void main(String[] args) 
{
new AwtFileList();
}
}
 
12、菜单——记事本
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class  NotepadDemo
{
private Frame f;
private MenuBar mb;
private Menu file,edit,format,see,hlep;
private MenuItem save,open,exit;
private TextArea textArea;
private FileDialog openDlg,saveDlg;
private File fil;
NotepadDemo()
{
init();
}
 
public void init()
{
//窗体初始化
f =new Frame("记事本");
f.setBounds(400,100,600,530);
//菜单栏初始化
mb = new MenuBar();
//菜单初始化
file=new Menu("文件(F)");
edit= new Menu("编辑(E)");
format= new Menu("格式(O)");
see= new Menu("查看(V)");
hlep= new Menu("帮助(H)");
 
//菜单项初始化
save = new MenuItem("保存");
open = new MenuItem("打开");
exit = new MenuItem("退出");
//文本区域初始化
textArea = new  TextArea();
//文件对话框初始化
//FileDialog(Frame parent, String title, int mode) 
          //创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
 //mode - 对话框的模式,可以是 FileDialog.LOAD 或 FileDialog.SAVE 
openDlg = new FileDialog(f,"打开文件",FileDialog.LOAD );
saveDlg = new FileDialog(f,"保存文件",FileDialog.SAVE);
 
//添加组件
f.setMenuBar(mb);
f.add(textArea);
mb.add(file);
mb.add(edit);
mb.add(format);
mb.add(see);
mb.add(hlep);
//
file.add(open);
file.add(save);
file.add(exit);
//显示窗体
enent();//调用事件
f.setVisible(true);
 
}
//定义事件
public void enent()
{
//窗体事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent w)
{
System.exit(0);
}
});
//菜单事件
//退出项
exit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent a)
{
System.exit(0);
}
});
 
//打开事件
open.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent a)
{
openDlg.setVisible(true);
//通过文件对话框对象中的方法获取 路径和文件名
//Strinig getDirectory() 获取此文件对话框的目录。
//String getFile() 获取此文件对话框的选定文件。
String path = openDlg.getDirectory();
String fileName =openDlg.getFile();
//如果在文件对话框中没有操作文件 不做任何动作
if(path==null || fileName==null)
return;
//清空文本区域
textArea.setText("");
f.setTitle(fileName+"-记事本");
fil = new File(path,fileName);
try
{
BufferedReader bfr = new BufferedReader(new FileReader(fil));
String line = null;
while((line = bfr.readLine())!=null)
{
textArea.append(line+"\r\n");
}
bfr.close();
}
catch (Exception e)
{
throw new RuntimeException("读取失败");
}
}
});
 
//保存事件
save.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent a)
{
//如果文件不存在
if(fil==null)
{
saveDlg.setVisible(true);
String path = saveDlg.getDirectory();
String fileName =saveDlg.getFile();
//如果在文件对话框中没有操作文件 不做任何动作
if(path==null || fileName==null)
return;
fil=new File(path,fileName);
}
try
{
BufferedWriter bfw = new BufferedWriter(new FileWriter(fil));
//获取文本区域中的内容
String text = textArea.getText();
bfw.write(text);
bfw.flush();
bfw.close();
}
catch (Exception e)
{
throw new RuntimeException("保存失败");
}
}
});
 
}
 
public static void main(String[] args) 
{
new NotepadDemo();
}
}
  
13、配置清单
让自己编写的程序能双击打开运行,怎么做呢?
1、一个程序产生许多类,我们可以通过命令将类封装到包中
javac -d c:\abc(要存放的目录) NotepadDemo.java
2、通过jar命令将目录中的文件做成jar包
jar -cvf note.jar(自己命名) NoteDemo(被打包的文件夹名称)
3、但产生的jar包需要自己配置清单 指定哪个类先运行
自己创建一个.txt文件,打开文件手动配置清单 格式是:
Main-Class :    空格    包名.类名 (回车必须要有)
之后再通过jar命令将.txt文件和类文件夹一起打包
jar -cvfm note.jar a.txt NoteDemo
---------------------- android开发java培训、期待与您交流! ----------------------
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics