------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
GUI介绍
GUI :
Graphical User Interface(图形用户接口):用图形的方式,来显示计算机操作的界面,这样更方编直观。
CLI:
Command line User Interfac(命令行用户接口):最常见的Dos命令行操作。需要记忆一些常用的命令,操作不直观。
Java为GUI提供的对象都存在java.awt和javax.swing两个包中。
Awt和Swing区别:
java.awt: AbstractWindow ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能,属于重量级控件。
javax.swing : 在awt的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件,对系统依赖性相对少了很多。
简单的说:awt在不同的操作系统上界面有细微差别,而swing可以在不同系统上统一。
Container常用子类:Window Panel(面板,不能单独存在)
Window常用子类:Frame Dialog
布局管理器
容器中的组件的排放方式就是布局。
常见布局管理器
FlowLayout 流式布局 从左到右 Panel默认的布局管理器
BorderLayout 边界布局 东南西北中 Frame默认的布局管理器
GridLayout 网格布局 规矩的矩阵
CardLayout 卡片布局 选项卡
GridBagLayout 网格包布局 非规则的矩阵
创建图形化界面步骤:
1、创建frame窗体
2、对窗体进行基本设置
比如大小,位置,布局
3、定义组件
4、将组件通过窗体的add方法添加到窗体中
5、让窗体显示,通过setVisible(true)
import java.awt.*; import java.awt.event.*; class AwtDemo { public static void main(String[] args) { Frame f = new Frame("my awt");// 创建一个最初不可见的、具有标题的Frame对象 f.setBounds(300, 200, 500, 400);// 设置坐标 窗体大小 /* * f.setSize(500,400);//设置窗体大小 (横,纵) f.setLocation(300,200);//顶点距离左上角位置 */ f.setLayout(new FlowLayout());// setLayout设置布局管理 Button but = new Button("按钮");// 设置按钮 f.add(but);// 添加按钮 /* * 因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。 * 并覆盖了其中的所有方法。那么只要继承自Windowadapter覆盖需要的方法即可。 */ f.addWindowListener(new WindowAdapter()// 匿名内部类 { public void windowClosing(WindowEvent e)// 关闭窗口 { System.out.println("我关"); System.exit(0); } /* * public voidwindowActivated(WindowEvent e) //窗口激活 { * System.out.println("我活了。"); } * * public voidwindowOpened(WindowEvent e) { * System.out.println("我被打开了,hahahhahah"); } */ }); f.setVisible(true);// 使窗体可见 } }
事件监听机制
特点:
1、事件源:awt包或者swing包中的那些图形界面组件
2、事件:每一个事件源都有自己特有的对应事件和共性事件
3、监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中
4、事件处理:引发事件后的处理方法
其中事件源、事件、监听器在java中都定义好了,直接获取其对象来用就可以了。
事件处理一般步骤步骤:
1、确定事件源(容器或组件)。通过事件源对象的addXXXListener()方法将监听器注册到该事件源上,该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
2、用匿名内部类来表示,在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
3、事件触发后把事件打包成对象传递给该变量。(包括事件源对象,通过getSource()或者getComponent()获取)
需求:让按钮具备退出程序的功能
<span style="white-space:pre"> </span>but.addActionListener(new ActionListener() { private int count = 1; public void actionPerformed(ActionEvent e) { Button b = (Button) e.getSource(); Frame f1 = (Frame) b.getParent(); f1.add(new Button("button-" + count++)); f1.validate(); } });
需求:鼠标进入事件
</pre><pre name="code" class="java"><span style="white-space:pre"> </span>but.addMouseListener(new MouseAdapter() { private int count = 1; private int clickCount = 1; public void mouseEntered(MouseEvent e) { System.out.println("鼠标进入到该组件" + count++); } public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) System.out.println("双击动作" + clickCount++); } });
需求:添加文本框,在文本框中输入0-9数字,输入其他字符返回非法字符
<span style="white-space:pre"> </span>Frame f1 = new Frame("my frame");
f1.setLayout(new FlowLayout());
TextField tf = new TextField(20);
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {
System.out.println(code + ".....是非法的");
e.consume();
}
}
});
需求:模拟Windows窗口,在文本框中输入目录,点击转到按钮,将该目录中的文件与文件夹名称列在下面的文本区域中,当输入的目录有误时,给出提示对话框
import java.awt.*; import java.awt.event.*; import java.io.File; class MyWindowDemo { private Frame f; private TextField tf;// 文本框 private Button but; private TextArea ta;// 文本区域 // 提示对话框三个元素 private Dialog d; private Label lab; private Button okBut; MyWindowDemo() { 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); // 提示对话框设置 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); f.add(tf); f.add(but); f.add(ta); myEvent(); f.setVisible(true); } private void myEvent() { okBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { d.setVisible(false); } }); d.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { d.setVisible(false); } }); tf.addKeyListener(new KeyAdapter()// 键盘输入回车符 { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) showDir(); } }); but.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showDir(); } }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } 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.append(name + "\r\n");// 追加文本,避免上一个文件被覆盖 } } else { String info = "您输入的信息:" + dirPath + "是错误的。请重输"; lab.setText(info); d.setVisible(true); } } public static void main(String[] args) { new MyWindowDemo(); } }
菜单
Menu:菜单,继承MenuItem;可添加Menu和MenuItem
MenuBar:菜单栏,可添加菜单和菜单条目,一般先创建菜单栏,再创建菜单
MenuItem:菜单条目,也称菜单项,无右三角的图标存在,是最终的菜单项
菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象这个事件源添加活动监听ActionListener,并进行相关的事件理。
需求:添加菜单项,通过Menu添加”文件”, 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("mywindow"); 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() { closeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new MyMenuDemo(); } }
需求:模拟简单记事本,具有打开和保存功能
import java.awt.*; import java.awt.event.*; import java.io.*; public class MyMenuTest { private Frame f; private MenuBar bar; private TextArea ta; private Menu fileMenu; private MenuItem openItem, saveItem, closeItem; private FileDialog openDia, saveDia; private File file; MyMenuTest() { init(); } public void init() { f = new Frame("mywindow"); f.setBounds(300, 100, 650, 600); bar = new MenuBar(); ta = new TextArea(); fileMenu = new Menu("文件"); openItem = new MenuItem("打开"); saveItem = new MenuItem("保存"); closeItem = new MenuItem("退出"); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(closeItem); bar.add(fileMenu); f.setMenuBar(bar); openDia = new FileDialog(f, "我要打开", FileDialog.LOAD); saveDia = new FileDialog(f, "我要保存", FileDialog.SAVE); f.add(ta); myEvent(); f.setVisible(true); } private void myEvent() { saveItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (file == null)// 当文件不存在的时候,在保存的时候要给文件命名 { saveDia.setVisible(true); String dirPath = saveDia.getDirectory(); String fileName = saveDia.getFile(); if (dirPath == null || fileName == null) return; file = new File(dirPath, fileName); } try { BufferedWriter bufw = new BufferedWriter(new FileWriter( file)); String text = ta.getText(); bufw.write(text); // bufw.flush(); bufw.close(); } catch (IOException ex) { throw new RuntimeException(); } } }); openItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openDia.setVisible(true); String dirPath = openDia.getDirectory(); String fileName = openDia.getFile(); // System.out.println(dirPath+"..."+fileName); if (dirPath == null || fileName == null) return; ta.setText(""); file = new File(dirPath, fileName); try { BufferedReader bufr = new BufferedReader(new FileReader( file)); String line = null; while ((line = bufr.readLine()) != null) { ta.append(line + "\r\n"); } bufr.close(); } catch (IOException ex) { throw new RuntimeException("读取失败"); } } }); closeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new MyMenuTest(); } }
Jar双击执行包
制作可以双击执行的jar包步骤:
1、将多个类封装到了一个包(package)中
2、定义一个jar包的配置信息
定义一个文件a.txt ,文件内容内容为:Main-Class:(空格)包名.类名(回车)
3、打jar包
jar -cvfm my.jar a.txt 包名
4、通过winrar程序进行验证,查看该jar的配置文件中是否有自定义的配置信息
5、通过工具--文件夹选项--文件类型--jar类型文件,通过高级,定义该jar类型文件的打开动作的关联程序
jdk\bin\javaw.exe -jar
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------